¿Cómo puedo personalizar una vista de alerta de iOS?

Quiero crear una alert view personalizada dentro de mi aplicación de iOS. Por ejemplo, quiero poner algunas images en esta alert y cambiar su color.

Sé cómo crear un UIAlertView normal, pero ¿hay alguna manera de personalizar una alert view ?

Configuré mi propio UIViewController que puedo usar con mis propias imágenes. Por lo general, solo uso uno o dos botones, por lo que oculto el segundo botón si no se usa. La vista es en realidad el tamaño de toda la pantalla, por lo que bloquea los toques detrás de ella, pero es en su mayoría transparente, por lo que se muestra el fondo.

Cuando lo traigo, utilizo algunas animaciones para hacerlo rebotar como la vista de alerta de Apple. Algo como esto funciona:

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

Tengo la posibilidad de que se cree un pequeño retraso en la clase, por lo que se llama a InitialDelayEnded cuando termina ese retraso.

Al inicializar, paso un objeto y un selector al que quiero llamar cuando se presiona cada botón, y luego llamo al selector apropiado en el objeto cuando se presiona un botón.

Aquí hay una vista de alerta personalizada que escribí que es un reemplazo directo para UIAlertView. Puede establecer una imagen de fondo personalizada; no sería difícil ampliar para admitir colores de fondo personalizados.

https://github.com/TomSwift/TSAlertView

Crea una subclase para UIAlertView.

Y crea clases comunes para el método Alert View. Agregue 2 debajo del método para ello.

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

Ahora, en cualquier clase, estás usando esta alerta personalizada: agrega debajo:

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

Para llamarlo: usar como a continuación:

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

Avísame en caso de alguna dificultad.

Tendrá que crear su propia vista personalizada e implementar algún comportamiento de estilo de vista de alerta, como mostrar de forma modal, oscurecer el fondo, animar dentro y fuera, etc.

No hay soporte en el SDK para personalizar un UIAlertView más allá del texto o los botones.

http://iphonedevelopment.blogspot.com/2010/05/custom-alert-views.html

y

http://www.skylarcantu.com/blog/2009/08/14/custom-uialertview-color-chooser/

Puede usar los enlaces anteriores para alertas personalizadas. Espero que estos te sean útiles.

Hay un muy buen ejemplo en el concentrador Git para la vista de alerta personalizada . Está utilizando la vista de alerta UI en el núcleo y proporciona varios métodos para personalizar la vista de alerta de diferentes maneras