我如何自定义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的一个直接替代品。 您可以设置自定义背景图片; 支持自定义背景颜色并不难。
为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。
http://iphonedevelopment.blogspot.com/2010/05/custom-alert-views.html
和
http://www.skylarcantu.com/blog/2009/08/14/custom-uialertview-color-chooser/
您可以使用上述链接进行自定义提醒。 我希望这些对你有帮助。
自定义警报视图在Git集线器上有很好的例子。 它在核心中使用UI警报视图,并提供了多种方法来以不同方式定制警报视图