2009-05-19 28 views

Respuesta

-2

No creo que haya un método o propiedad expuesto para hacer esto. Establecer el backgroundColor de UIAlertView (como UIView) simplemente pone un fondo rectangular de color detrás de la vista de alerta.

Diría que probablemente sea contrario a la interfaz común del iPhone alterar este color, por lo que no creo que sea el comportamiento recomendado (del mismo modo que cambiar el color de fondo de una vista de alerta en Mac OS X no es recomendado).

+5

Es cierto, pero supongo que si Apple nos impone reglas, deberían seguir reglas similares también, ¿estoy en lo cierto? Si ve las AlertViews de GameKit, todas tienen el color de fondo negro. ¡Extraño! – doNotCheckMyBlog

3

Esto no es algo que es posible.

O bien necesita crear su propia vista de tipo de alerta (incluida la provisión de la animación, etc.) o utilizar el UIAlertView predeterminado proporcionado por Apple.

Apple tiende a no exponer cosas como el color de UIAlertView para que la interfaz de usuario tenga una sensación común en todas las aplicaciones. Cambiar el color de la aplicación a la aplicación sería confuso para el usuario.

+16

No permitir cambiar el color hará que los desarrolladores de aplicaciones creen sus propios elementos de IU, lo que podría terminar siendo aún más confuso;) – Thomas

33

Antecedentes de AlertView es una imagen y se puede cambiar esta imagen

UIAlertView *theAlert = [[[UIAlertView alloc] initWithTitle:@"Atention" 
    message: @"YOUR MESSAGE HERE", nil) 
    delegate:nil cancelButtonTitle:@"OK" otherButtonTitles:nil] autorelease]; 

    [theAlert show]; 

    UILabel *theTitle = [theAlert valueForKey:@"_titleLabel"]; 
    [theTitle setTextColor:[UIColor redColor]]; 

    UILabel *theBody = [theAlert valueForKey:@"_bodyTextLabel"]; 
    [theBody setTextColor:[UIColor blueColor]]; 

    UIImage *theImage = [UIImage imageNamed:@"Background.png"];  
    theImage = [theImage stretchableImageWithLeftCapWidth:16 topCapHeight:16]; 
    CGSize theSize = [theAlert frame].size; 

    UIGraphicsBeginImageContext(theSize);  
    [theImage drawInRect:CGRectMake(0, 0, theSize.width, theSize.height)];  
    theImage = UIGraphicsGetImageFromCurrentImageContext();  
    UIGraphicsEndImageContext(); 

    [[theAlert layer] setContents:[theImage CGImage]]; 
+0

Asegúrese de consultar: http://stackoverflow.com/questions/883208/how-to-change-background-color-of-uialertview/1478873#1478873 para obtener sugerencias de mejora – Casebash

+0

cómo puedo hacer que la imagen se escale hasta que se ajuste a la vista de alerta? – aryaxt

+0

Intenté esto pero no funcionó. ¿Hay algún requisito para el tamaño de la imagen? En este momento estoy usando una imagen de alta resolución. – Ankur

12

También he encuentro una solución casi idéntica y, en mi caso, funciona mejor. Usando la salida de oxígeno he descubierto un resultado pobre en la pantalla y el contexto se vuelve borroso. En lugar de la subclasificación UIAlertView implemento:

- (void)willPresentAlertView:(UIAlertView *)alertView; 

así que ... sólo tienes que copiar & pasta

- (void)willPresentAlertView:(UIAlertView *)alertView 
{ 
    blah blah blah... 
    [[alertView layer] setContents:(id)theImage.CGImage]; // to avoid the warning 
} 
+0

A partir de iOS 5, este enfoque ya no funciona :( –

+2

funciona también en iOS 6, amigo – harshitgupta

2

Añadir marco QuartzCore a la solicitud e incluir import "QuartzCore/CALayer.h" en el archivo de origen .

+0

gracias a que QuartzCore ha solucionado el problema – aryaxt

7

Bueno he resuelto el problema de una manera diferente. Busqué el UIImageView que contiene la imagen de fondo y cambio la imagen.

... así espectáculo no es quizá la mejor solución para alterar la vista ...

@implementation CustomAlertView 

- (void)show { 
    [super show]; 

    for (UIView *view in self.subviews) { 
     NSLog(@"%@ with %i children", view, [view.subviews count]); 
     // change the background image 
     if ([view isKindOfClass:[UIImageView class]]) { 
      UIImage *theImage = [UIImage imageNamed:@"password entry bg - default.png"];  
      ((UIImageView *)view).image = [theImage resizableImageWithCapInsets:UIEdgeInsetsMake(49, 8, 8, 8)]; 
     } 
    } 
} 

@end 
+1

Este enfoque aún funciona a partir de iOS 5, y la sustitución de la imagen se puede hacer en el método '- (void) willPresentAlertView: (UIAlertView *) alertView', que no requiere anular el método 'show'. –

+0

Sólo pensé en aclarar: si está creando una subclase de UIAlertView, anule - (void) show. O puede incluir el código de arriba dentro de willPresentAlertView en el delegado. –

+0

Esto funcionó para mí. Gracias amigo. –

4

Aquí es una solución mucho más reciente que se aprovecha de bloques y sigue el modelo de tweetbot:

https://github.com/Arrived/BlockAlertsAnd-ActionSheets

+0

El enlace parece estar roto –

+1

Así es. Aquí hay una bifurcación de esa rama: https://github.com/gpambrozio/BlockAlertsAnd-ActionSheets – esilver

+0

Advertencia sobre esa clase: no sabe cómo mostrarse correctamente cuando se gira el dispositivo. Tampoco es compatible con iOS 3.1.x – esilver

0

usted tiene que utilizar esto:

UIAlertView *alert=[[UIAlertView alloc]initWithTitle:@"You are Select Row of" message:@"Human" delegate:self cancelButtonTitle:@"OK" otherButtonTitles:nil]; 
     alert.backgroundColor=[UIColor redColor]; 
     [alert show]; 
     [alert release]; 

cambiará el color de fondo de UIAlertView.

+0

Esto cambia el color de fondo de clearColor a un color sólido que da como resultado un UIAlertView de aspecto muy pobre. – TMilligan

0

Sólo tiene que utilizar este código,

UIImage *theImage = [UIImage imageNamed:@"imageName.png"]; 
UIView *view=[alert valueForKey:@"_backgroundImageView"]; 
//Set frame according to adustable 
    UIImageView *image=[[UIImageView alloc] initWithImage:theImage]; 
[image setFrame:CGRectMake(0, 0, 280, 130)]; 
[view addSubview:image]; 
Cuestiones relacionadas