2011-05-09 17 views
36

Me gustaría saber crear una sombra paralela para UINavigationbar. Traté de crear un fondo de barra de navegación personalizada con sombra paralela, pero la sombra paralela cubre la vista de fondo.Cómo crear UINavigationBar soltar sombra

@implementation UINavigationBar (CustomImage) 
- (void)drawRect:(CGRect)rect { 
    UIImage *image = [[UIImage imageNamed:@"titleBar.png"] retain];; 
    [image drawInRect:rect]; 
    [image release]; 
} 

- (CGSize)sizeThatFits:(CGSize)size { 
    CGSize newSize = CGSizeMake(320,50); 
    return newSize; 
} 
@end 

I also tried on following solution: http://www.travisboudreaux.com/adding-a-drop-shadow-to-a-uinavigationbar: 

@interface UINavigationBar (dropshadow) 

-(void) applyDefaultStyle; 

@end 

@implementation UINavigationBar (dropshadow) 

-(void)willMoveToWindow:(UIWindow *)newWindow{ 
    [self applyDefaultStyle]; 
} 

- (void)applyDefaultStyle { 
    // add the drop shadow 
    self.layer.shadowColor = [[UIColor blackColor] CGColor]; 
    self.layer.shadowOffset = CGSizeMake(0.0, 3.0); 
    self.layer.shadowOpacity = 0.25; 
} 
@end 

Muestra la sombra paralela para el botón de la barra de navegación, pero no la barra de navegación en sí.

Solución final: Así es como creo shadow para UINavigationBar. Muchas gracias por MusiGenesis para señalar el eslabón perdido de mi código:

#import <QuartzCore/QuartzCore.h> 

@interface UINavigationBar (CustomImage) 

-(void) applyDefaultStyle; 

@end 

//Override For Custom Navigation Bar 
@implementation UINavigationBar (CustomImage) 
- (void)drawRect:(CGRect)rect { 
    UIImage *image = [UIImage imageNamed: @"titleBar.png"]; 
    [image drawInRect:CGRectMake(0, 0, 320, 44)]; 
} 

-(void)willMoveToWindow:(UIWindow *)newWindow{ 
    [super willMoveToWindow:newWindow]; 
    [self applyDefaultStyle]; 
} 

- (void)applyDefaultStyle { 
    // add the drop shadow 
    self.layer.shadowColor = [[UIColor blackColor] CGColor]; 
    self.layer.shadowOffset = CGSizeMake(0.0, 3); 
    self.layer.shadowOpacity = 0.25; 
    self.layer.masksToBounds = NO; 
    self.layer.shouldRasterize = YES; 
} 

@end 

** Recuerde que importar quartzcore o se tirarán de error.

+0

rápida FYI, creo que llamar '[súper willMoveToWindow: ..] 'es redundante en una categoría – Sam

+0

Ah..yes lo es. Lo he modificado Gracias. – TonyTakeshi

+0

esto me ayudó mucho, ¡gracias! – boz

Respuesta

28

En applyDefaultStyle, trate de añadir esta línea:

self.layer.masksToBounds = NO; 

El valor predeterminado de esta propiedad es YES, lo que significa que a pesar de que la sombra se hace, no va a ser prestados fuera de los límites de la vista , lo que significa efectivamente que no lo ves en absoluto.

Si desea animar este punto de vista de cualquier manera, también se debe añadir esta línea:

self.layer.shouldRasterize = YES; 

... a menos que usted desea que la animación sea lenta y desigual.

+0

Gracias, hermano!Me has ahorrado mucho tiempo antes de pensar en dibujar la sombra con cuarzo. No esperaba que fuera tan fácil. – TonyTakeshi

+0

Soy un gran fan de las sombras paralelas, y pasé por lo mismo de preguntarme por qué mis sombras nunca aparecieron. – MusiGenesis

44

Si se aplica una sombra a un UINavigationBar, la sombra se recorta por debajo de las esquinas:

clipped shadow

Esto es sólo cómo se comportan las sombras en rectángulos. Por lo general crear un camino para que la sombra que es un poco más ancha que la barra de navegación real, lo que crea un efecto que se parece más a lo que generalmente era de esperar:

@implementation UINavigationBar (DropShadow) 

-(void)willMoveToWindow:(UIWindow *)newWindow { 
    [super willMoveToWindow:newWindow]; 
    self.layer.shadowColor = [UIColor blackColor].CGColor; 
    self.layer.shadowOpacity = 1; 
    self.layer.shadowOffset = CGSizeMake(0,4); 
    CGRect shadowPath = CGRectMake(self.layer.bounds.origin.x - 10, self.layer.bounds.size.height - 6, self.layer.bounds.size.width + 20, 5); 
    self.layer.shadowPath = [UIBezierPath bezierPathWithRect:shadowPath].CGPath; 
    self.layer.shouldRasterize = YES; 
} 

better

+1

ShadowPath. Gracias por eso. –

+0

sugeriría esto sobre agregar una "sombra" -png como la sub-vista. Lo estoy preguntando desde la perspectiva del rendimiento – carbonr

+0

Si establece 'shouldRasterize = YES', no creo que haya una diferencia de rendimiento discernible. Este enfoque también funciona bien con la rotación, aunque supongo que el enfoque de imageView funcionaría si usa un CGRect más amplio. –

9

Desde iOS 6.0, UINavigationBar tiene un ShadowImage propiedad:

@property(nonatomic,retain) UIImage *shadowImage NS_AVAILABLE_IOS(6_0) UI_APPEARANCE_SELECTOR; 

que por supuesto simplifica enormemente esta tarea muy común: D

-1

que se adhieren a la sombra código de dibujo en una función para mantener loadView limpio. Podría pasar el objeto sobre el que desea dibujar la sombra si desea que todas sus sombras sean consistentes.

- (void)loadView 
{ 
    self.view = [[UIView alloc] init]; 
    self.view.backgroundColor = [UIColor whiteColor]; 

    [self drawShadow]; 
} 


- (void)drawShadow 
{ 
    self.navigationController.navigationBar.backgroundColor = [UIColor clearColor]; 
    self.navigationController.navigationBar.layer.shadowOpacity = 0.3; 
    self.navigationController.navigationBar.layer.shadowOffset = CGSizeMake(0, 0); 
    self.navigationController.navigationBar.layer.shadowRadius = 15; 
    self.navigationController.navigationBar.layer.masksToBounds = NO; 
} 
Cuestiones relacionadas