2011-06-08 9 views
27

Descargué el SDK de IOS5 ayer, y este código que uso para configurar el fondo de mi UIToolbar en una imagen personalizada dejó de funcionar. Si configuro el objetivo en IOS4.3 y debajo, aún funciona.Imagen de fondo personalizada en UIToolbar en el SDK de IOS5

[self.bizToolbar insertSubview:[[[UIImageView alloc] initWithImage:[UIImage imageNamed:@"navbar-iphone.png"]] autorelease] atIndex:0]; 

¿Alguien ha encontrado esto en IOS 5?

+2

IOS5 es bajo NDA por lo que creo que se puede hablar de ello en los foros dedicados de Apple sólo – Vladimir

Respuesta

49

que puede utilizar: [[UIToolBar appearance] setBackgroundImage:toolBarIMG forBarMetrics:UIBarMetricsDefault]; (nuevo en iOS 5)

+0

Esto es brillante, ya que establece claramente el fondo de * todas * las barras de navegación, no es necesario que lo haga a cada una de ellas. Gracias por señalarme en la dirección correcta. – Chris

+0

Cualquier equivalente para UIToolbar? – Chris

+59

[[UIToolbar appearance] setBackgroundImage: barsBack forToolbarPosition: UIToolbarPositionAny barMetrics: UIBarMetricsDefault] – Chris

3

Este método no está documentado y se basa en la estructura de subvistas específicas de UIToolbar que se puede cambiar de una versión a otra. Así que eso es exactamente lo que probablemente sucedió con iOS5 versión

P.S. Si marca informado UIToolBar class referencia encontrará otra forma de personalizar UIToolBar

+0

Validmir gracias por el puntero. Verificare la documentacion. Intenté esto por ahora y funciona en todas las versiones de IOS. @interface WoodenToolbar: UIToolbar {} - (void) drawRect: (CGRect) rect; @end @implementation WoodenToolbar - (void) drawRect: (CGRect) rect { UIImage * imagen = [UIImage imageNamed: @ "navbar-iphone.png"]; [image drawInRect: CGRectMake (0, 0, self.frame.size.width, self.frame.size.height)]; } @end – StackThis

35

Supongamos que usted se conectó iOS5 beta del SDK, se podría hacer algo como esto

if([navigationBar respondsToSelector:@selector(setBackgroundImage:forBarMetrics:)]) { 
     //iOS 5 new UINavigationBar custom background 
     [navigationBar setBackgroundImage:image forBarMetrics: UIBarMetricsDefault]; 
} 

Para darse cuenta de esto, echar un vistazo a aquí iOS 4.3 to iOS 5.0 API Differences y busque "UINavigationBar.h"

o tomar un vistazo de cerca a la nueva firma del método aquí setBackgroundImage:forBarMetrics:

También aquí está el enum UIBarMetrics tipo

Espero que esto ayude.

+0

¡Muchas gracias!Esto funcionó perfectamente – shabbirv

10

Esto funcionó en mi barra de herramientas:

//toolBar background image set based on iOS version 
    [[UIDevice currentDevice] systemVersion]; 

    if ([[[UIDevice currentDevice] systemVersion] floatValue] > 4.9) { 

     //iOS 5 
     UIImage *toolBarIMG = [UIImage imageNamed: @"toolBar_brown.png"]; 

     if ([toolBar respondsToSelector:@selector(setBackgroundImage:forToolbarPosition:barMetrics:)]) { 
      [toolBar setBackgroundImage:toolBarIMG forToolbarPosition:0 barMetrics:0]; 
     } 

    } else { 

     //iOS 4 
     [toolBar insertSubview:[[[UIImageView alloc] initWithImage:[UIImage imageNamed:@"toolBar_brown.png"]] autorelease] atIndex:0]; 

    } 
+6

No es necesario comprobar la versión del sistema (y esto generalmente no es una buena práctica), porque la comprobación '-respondsToSelector' debería ser suficiente para determinar si se debe usar la nueva forma o la forma antigua de hacerlo. –

+0

ios5 funciona bien pero ios 4 no responde. ¿que debería hacer? – Hiren

0

Esto es a lo largo de la misma línea que la respuesta de Simone, pero funciona para iOS 5 y iOS < 5. Esto es lo que estoy usando en la aplicación. Debe llamar al [UINavigationBar setupIos5PlusNavBarImage] en algún lugar de la inicialización de su aplicación (applicationDidFinishLaunching: es un buen candidato). En iOS 5+, setupIos5PlusNavBarImage utilizará el nuevo protocolo UIAppearance para establecer el fondo y se ignorará la anulación drawRect. En iOS < 5, setupIos5PlusNavBarImage será básicamente no operativo y drawRect manejará el dibujo de la imagen.

Interfaz:

@interface UINavigationBar (CustomNavigationBar) 

+ (void) setupIos5PlusNavBarImage; 

- (void) drawRect: (CGRect) rect; 

@end 

Implementación:

@implementation UINavigationBar (CustomNavigationBar) 

+ (void) setupIos5PlusNavBarImage 
{ 
    if ([UINavigationBar respondsToSelector: @selector(appearance)]) 
    { 
     [[UINavigationBar appearance] setBackgroundImage: [UIImage imageNamed: @"menuBar.png"] forBarMetrics: UIBarMetricsDefault]; 
    } 
} 

- (void) drawRect: (CGRect) rect 
{ 
    UIImage* img = [UIImage imageNamed: @"menuBar.png"]; 
    [img drawInRect: CGRectMake(0, 0, self.frame.size.width, self.frame.size.height)]; 
} 

@end 
Cuestiones relacionadas