2010-12-01 19 views
6

Quiero agregar el efecto de sombra para UINavigationbar como GameCenter.efecto de sombra para UINavigationbar como GameCenter

Creo que aplicar la imagen de fondo con la sombra a la barra de navegación, pero la altura de la línea del título estaría abajo. Y dibujo sombra para el fondo, pero la imagen de fondo no se desplazará.

¿Cuál es la mejor práctica de este caso?

Respuesta

5

Puede subclase UINavigationController y luego tiene una capa de sombra para cada navegación o si su barra siempre está visible simplemente agregue la sombra a UIWindow (solo una para toda la aplicación) y luego sea la vista de frente cada vez que agregue un subvista.

CGColorRef darkColor = [[UIColor blackColor] colorWithAlphaComponent:.5f].CGColor; 
CGColorRef lightColor = [UIColor clearColor].CGColor; 

CAGradientLayer *newShadow = [[[CAGradientLayer alloc] init] autorelease]; 
newShadow.frame = CGRectMake(0, self.navigationBar.frame.size.height, self.navigationBar.frame.size.width, 10); 
newShadow.colors = [NSArray arrayWithObjects:(id)darkColor, (id)lightColor, nil]; 

[self.navigationBar.layer addSublayer:newShadow]; 

Si elige este último caso, entonces anular el didAddSubview para hacer la capa del primer plano:

CALayer *superlayer = self.shadowLayer.superlayer; 
[self.shadowLayer removeFromSuperlayer]; 
[superlayer addSublayer:self.shadowLayer]; 

espero que ayude.

+0

Intentando implementar esto en un Controlador de Vista y sin ver nada ... – fuzz

+0

Asegúrese de tener una instancia de controlador de navegación? Parece que su barra de navegación apunta a nulo. – marcio

2

Se hace fácilmente con la subclase personalizada de UINavigationController. La clave es sobrescribir -viewWillAppear: subcapa y añadir a la capa de vista de UINavigationController: representa

- (void)viewWillAppear:(BOOL)animated 
{ 
    CGColorRef darkColor = [[UIColor blackColor] colorWithAlphaComponent:.5f].CGColor; 
    CGColorRef lightColor = [UIColor clearColor].CGColor; 

    CGFloat navigationBarBottom; 
    navigationBarBottom = self.navigationBar.frame.origin.y + self.navigationBar.frame.size.height; 

    CAGradientLayer *newShadow = [[[CAGradientLayer alloc] init] autorelease]; 
    newShadow.frame = CGRectMake(0,navigationBarBottom, self.view.frame.size.width, 10); 
    newShadow.colors = [NSArray arrayWithObjects:(id)darkColor, (id)lightColor, nil]; 

    [self.view.layer addSublayer:newShadow]; 
    [super viewWillAppear:animated]; 
} 

navigationBarBottom tanto para UINavigationBar y barra de estado. El crédito para los parámetros de la capa de gradiente va a marcio.

1

Dibujando un CAGradientLayer da un aspecto muy uniforme, pero - en mi opinión - una sombra que parece bastante antinatural.

Aquí hay un enfoque alternativo basado en la respuesta a la pregunta UIView with shadow.

Utiliza las diversas propiedades de sombra de CALayer para dar el efecto de sombra:

#pragma mark - View lifecycle 

- (void)viewDidLoad 
{ 
    [super viewDidLoad]; 
     
    self.navigationController.navigationBar.layer.shadowColor = [[UIColor blackColor] CGColor]; 
    self.navigationController.navigationBar.layer.shadowOffset = CGSizeMake(0.0f,0.0f); 
    self.navigationController.navigationBar.layer.shadowOpacity = 1.0f; 
    self.navigationController.navigationBar.layer.shadowRadius = 4.0f; 
} 

La misma técnica trabaja con el tabBarController 's tabBar;

self.tabBarController.tabBar.layer.shadowColor = [[UIColor blackColor] CGColor]; 
self.tabBarController.tabBar.layer.shadowOffset = CGSizeMake(0.0f,0.0f); 
self.tabBarController.tabBar.layer.shadowOpacity = 1.0f; 
self.tabBarController.tabBar.layer.shadowRadius = 4.0f; 
Cuestiones relacionadas