简体   繁体   English

如何自定义iOS警报视图?

[英]How can I customize an iOS alert view?

I want to create a custom alert view within my iOS application. 我想在iOS应用程序中创建自定义alert view For example, I want to put some images in this alert , and change its color. 例如,我想在此alert放置一些images ,并更改其颜色。

I know how to create a normal UIAlertView , but is there a way to customize an alert view ? 我知道如何创建一个普通的UIAlertView ,但有没有办法自定义alert view

I set up my own UIViewController which I can skin with my own images. 我设置了自己的UIViewController,我可以使用自己的图像进行修饰。 I generally only use one or two buttons, so I hide the second button if it's not being used. 我通常只使用一个或两个按钮,所以如果它没有被使用我隐藏第二个按钮。 The view is actually the size of the entire screen, so it blocks touches behind it, but it is mostly transparent, so the background shows through. 视图实际上是整个屏幕的大小,因此它会阻挡它背后的触摸,但它大部分都是透明的,因此背景显示出来。

When bringing it in, I use a few animations to make it bounce like Apple's alert view. 把它带进来的时候,我会用一些动画让它像Apple的警示视图一样反弹。 Something like this works: 像这样的东西有效:

-(void)initialDelayEnded {
    self.view.transform = CGAffineTransformScale(CGAffineTransformIdentity, 0.001, 0.001);
    self.view.alpha = 1.0;
    [UIView beginAnimations:nil context:nil];
    [UIView setAnimationDuration:kTransitionDuration/1.5];
    [UIView setAnimationDelegate:self];
    [UIView setAnimationDidStopSelector:@selector(bounce1AnimationStopped)];
    self.view.transform = CGAffineTransformScale(CGAffineTransformIdentity, 1.1, 1.1);
    [UIView commitAnimations];
}

- (void)bounce1AnimationStopped {
    [UIView beginAnimations:nil context:nil];
    [UIView setAnimationDuration:kTransitionDuration/2];
    [UIView setAnimationDelegate:self];
    [UIView setAnimationDidStopSelector:@selector(bounce2AnimationStopped)];
    self.view.transform = CGAffineTransformScale(CGAffineTransformIdentity, 0.9, 0.9);
    [UIView commitAnimations];
}

- (void)bounce2AnimationStopped {
    [UIView beginAnimations:nil context:nil];
    [UIView setAnimationDuration:kTransitionDuration/2];
    self.view.transform = CGAffineTransformIdentity;
    [UIView commitAnimations];
}

I have the possibility of a short delay built into the class, so initialDelayEnded is called when that delay is over. 我有可能在类中内置一个短延迟,因此当延迟结束时会调用initialDelayEnded。

When initializing, I pass in an object and selector I want called when each button is pressed, and then I call the appropriate selector on the object when a button is pressed. 初始化时,我按下每个按钮时传入一个我想调用的对象和选择器,然后在按下按钮时调用对象上的相应选择器。

Here's a custom alert view that I wrote which is a drop-in replacement for UIAlertView. 这是我写的自定义警报视图,它是UIAlertView的替代品。 You can set a custom background image; 您可以设置自定义背景图像; it wouldn't be hard to extend to support custom background colors. 扩展以支持自定义背景颜色并不难。

https://github.com/TomSwift/TSAlertView https://github.com/TomSwift/TSAlertView

Create one sub class for UIAlertView. 为UIAlertView创建一个子类。

And create common class for Alert View method. 并为Alert View方法创建公共类。 Add 2 below method for it. 为它添加以下方法2。

#pragma mark Alert View Functions
+(void)alertViewWithYesNo:(NSString *)pstrTitle:(NSString *)pstrMessage:(int)pstrTagId:(id)pDelegate{
UIAlertView *objAlertNotify = [[UIAlertView alloc] init];
[objAlertNotify setDelegate:pDelegate];

[objAlertNotify addButtonWithTitle:@""];
[objAlertNotify addButtonWithTitle:@""];
int intTemp = 1;
for (UIView* view in [objAlertNotify subviews])
{
    if ([[[view class] description] isEqualToString:@"UIAlertButton"])
    {
        UILabel *theTitle = [[UILabel alloc] init];
        [theTitle setFont:[UIFont fontWithName:@"Helvetica-Bold" size:g_AlertFontSize]];
        [theTitle setTextColor:[UIColor whiteColor]];
        switch (intTemp) {
            case 1:
                [theTitle setText:@"Yes"];
                //[theTitle setTextColor:g_ColorYes];
                break;
            case 2:
                [theTitle setText:@"No"];
                //[theTitle setTextColor:g_ColorNo];
                break;
        }
        intTemp++;

        [theTitle setBackgroundColor:[UIColor clearColor]];             
        [theTitle setTextAlignment:UITextAlignmentCenter];
        [view addSubview:theTitle];
    }
    else if ([[[view class] description] isEqualToString:@"UIThreePartButton"])
    {
        UILabel *theTitle = [[UILabel alloc] init];
        [theTitle setFont:[UIFont fontWithName:@"Helvetica-Bold" size:g_AlertFontSize]];
        [theTitle setTextColor:[UIColor whiteColor]];
        switch (intTemp) {
            case 1:
                [theTitle setText:@"Yes"];
                //[theTitle setTextColor:g_ColorYes];
                break;
            case 2:
                [theTitle setText:@"No"];
                //[theTitle setTextColor:g_ColorNo];
                break;
        }
        intTemp++;

        [theTitle setBackgroundColor:[UIColor clearColor]];             
        [theTitle setTextAlignment:UITextAlignmentCenter];
        [view addSubview:theTitle];
    }
}
[objAlertNotify setTag:pstrTagId];
[objAlertNotify setTitle:pstrTitle];
[objAlertNotify setMessage:pstrMessage];
[objAlertNotify show];
}

+(void)alertViewBtnText:(UIAlertView *)alertView{
for (UIView* view in [alertView subviews])
{
    //NSLog(@"%@", [[view class] description]);

    if ([[[view class] description] isEqualToString:@"UIAlertButton"])
    {   
        for (UILabel *lbl in [view subviews])
        {   
            //NSLog(@"%@", [[lbl class] description]);

            if ([[[lbl class] description] isEqualToString:@"UILabel"])
            {
                CGRect frame = [view bounds];

                CGSize maximumLabelSize = CGSizeMake(320,480);
                CGSize expectedLabelSize = [lbl.text sizeWithFont:lbl.font constrainedToSize:maximumLabelSize lineBreakMode:lbl.lineBreakMode];
                CGRect newFrame = lbl.frame;
                newFrame.origin.x = newFrame.origin.x - expectedLabelSize.width/2;
                newFrame.size.height = expectedLabelSize.height;
                newFrame.size.width = expectedLabelSize.width;
                lbl.frame = newFrame;
                //frame.size.width = 320.0;
                //frame.size.height = 480.0;

                lbl.frame = frame;
                [lbl setCenter:CGPointMake([view bounds].size.width/2, [view bounds].size.height/2)];
            }
        }
    }
    else if ([[[view class] description] isEqualToString:@"UIThreePartButton"])
    {   
        for (UILabel *lbl in [view subviews])
        {   
            CGRect frame = [view bounds];

            CGSize maximumLabelSize = CGSizeMake(320,480);
            CGSize expectedLabelSize = [lbl.text sizeWithFont:lbl.font constrainedToSize:maximumLabelSize lineBreakMode:lbl.lineBreakMode];
            CGRect newFrame = lbl.frame;
            newFrame.origin.x = newFrame.origin.x - expectedLabelSize.width/2;
            newFrame.size.height = expectedLabelSize.height;
            newFrame.size.width = expectedLabelSize.width;
            lbl.frame = newFrame;
            //frame.size.width = 320.0;
            //frame.size.height = 480.0;

            lbl.frame = frame;
            [lbl setCenter:CGPointMake([view bounds].size.width/2, [view bounds].size.height/2)];
        }
    }
}
}

Now, in whatever class, you are using this custom Alert: Add below: 现在,在任何课程中,您都在使用此自定义警报:在下面添加:

#pragma mark UIAlertViewDelegate
-(void)willPresentAlertView:(UIAlertView *)alertView{

if(alertView==objAlertMsg){
    /*clsCommonFuncDBAdapter *objclsCommonFuncDBAdapter = [[clsCommonFuncDBAdapter alloc] init];
    float newHeight = [objclsCommonFuncDBAdapter getAlertHeightByMessage:alertView.frame.size.width :alertView.message] + [g_AlertExtraHeight intValue];
    [objclsCommonFuncDBAdapter release];

    //NSLog(@"X = %f, Y = %f, Widht = %f, Height = %f", alertView.frame.origin.x, alertView.frame.origin.y, alertView.frame.size.width, alertView.frame.size.height);
    //[alertView setFrame:CGRectMake(alertView.frame.origin.x, alertView.frame.origin.y, alertView.frame.size.width, 110.0)];
    [alertView setFrame:CGRectMake(alertView.frame.origin.x, alertView.frame.origin.y, alertView.frame.size.width, newHeight)];*/
}

[clsCommonFuncDBAdapter alertViewBtnText:alertView];

}

For calling it: Use like below: 用于调用它:使用如下:

-(void)askForGPSEnable{
[clsCommonFuncDBAdapter alertViewWithYesNo:msgGPSTitle :msgGPSMessage :0 :self];
}

Let me know in case of any difficulty. 如有任何困难,请告诉我。

You'll need to create your own custom view, and implement some alert view style behaviour, such as displaying modally, dimming the background, animating in and out, etc. 您需要创建自己的自定义视图,并实现一些警报视图样式行为,例如显示模式,调暗背景,动画进出等。

There's no support in the SDK for customising a UIAlertView any further than the text or buttons. SDK中没有支持自定义UIAlertView的文本或按钮。

There is very good example on Git hub for custom alert view . Git hub上有一个非常好的自定义警报视图示例。 It is using UI alert view in core and provides number of methods to customize alert view in different ways 它在核心中使用UI警报视图,并提供了多种方法来以不同方式自定义警报视图

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM