2010-12-01 11 views
6

Ich möchte Schatteneffekt für UINavigationbar wie GameCenter hinzufügen.Schatteneffekt für UINavigationbar wie GameCenter

Ich denke, Hintergrundbild mit Schatten auf Nav-Bar anwenden, aber Titelzeile Höhe wäre unten. Und ich zeichne Schatten zum Hintergrund, aber Hintergrundbild würde nicht scrollen.

Was ist die beste Praxis dieses Falles ??

Antwort

5

Sie können UINavigationController ableiten und haben dann eine Schattenebene für jede Navigation oder wenn Ihre Leiste immer sichtbar ist, fügen Sie einfach den Schatten zu UIWindow hinzu (nur eines für die gesamte Anwendung) und dann jedes Mal, wenn Sie ein hinzufügen Unteransicht.

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

Wenn Sie die letzteren Fall dann überschreiben die didAddSubview wählen die Schicht die vorderste zu machen:

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

Hoffe, es hilft.

+0

Versuchen, dies in einen View Controller zu implementieren und nichts zu sehen ... – fuzz

+0

sicher, eine Navigationssteuerungsinstanz zu haben? Es scheint, dass Ihre navigationBar auf Null zeigt. – marcio

2

Es ist einfach mit benutzerdefinierten Unterklasse von UINavigationController getan. Der Schlüssel ist -viewWillAppear zu überschreiben: und fügt Unterschicht zu UINavigationController der Ebene der Ansicht:

- (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 für bar beide UINavigationBar und Status-Konten. Kredit für Gradientenschichtparameter geht an marcio.

1

Zeichnung eine CAGradientLayer ergibt eine sehr einheitliche, aber - meiner Meinung nach - ein eher unnatürlich aussehenden Schatten.

Hier ist ein alternativer Ansatz basierend auf der Antwort auf Frage UIView with shadow.

Es nutzt die verschiedenen Schatten Eigenschaften von CALayer den Schatteneffekt zu geben:

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

Die gleiche Technik arbeitet mit der tabBarController ‚s tabBar;

Verwandte Themen