我如何自定义iOS警报视图?

我想在我的iOS应用程序中创build一个自定义alert view 。 例如,我想在此alert放入一些images ,并更改其颜色。

我知道如何创build一个正常的UIAlertView ,但有没有办法自定义一个alert view

我build立了自己的UIViewController,我可以用自己的图像皮肤。 我通常只使用一个或两个button,所以我隐藏第二个button,如果它没有被使用。 该视图实际上是整个屏幕的大小,所以它阻挡了它后面的触摸,但它大多是透明的,所以背景显示通过。

当把它带入时,我使用了一些animation来使它像苹果的警觉一样反弹。 像这样的作品:

 -(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]; } 

我有可能在类中build立一个短暂的延迟,所以当延迟结束时调用initialDelayEnded。

当初始化时,我传入一个对象和select器,当每个button被按下时,然后在按下button时调用对象的相应select器。

这是我写的一个自定义警报视图,它是UIAlertView的一个直接替代品。 您可以设置自定义背景图片; 支持自定义背景颜色并不难。

https://github.com/TomSwift/TSAlertView

为UIAlertView创build一个子类。

并为Alert View方法创build公共类。 为其添加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)]; } } } } 

现在,无论什么课,你都使用这个自定义警报:添加下面:

 #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]; } 

为了调用它:使用如下:

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

如有任何困难,请告知我。

您需要创build自己的自定义视图,并实现一些警报视图风格的行为,如模态显示,调暗背景,animation进出等。

除了文本或button之外,SDK中不支持定制UIAlertView。

自定义警报视图在Git集线器上有很好的例子。 它在核心中使用UI警报视图,并提供了多种方法来以不同方式定制警报视图