2010-12-01 8 views
6

GameCenterのようなUINavigationbarにシャドウエフェクトを追加したい。GameCenterのようなUINavigationbarのシャドーエフェクト

私は、影のナビゲーションバーを使って背景画像を適用すると思いますが、タイトルの行の高さは下がります。 背景に影を描きますが、背景の画像はスクロールしません。

このケースのベストプラクティスは何ですか?

答えて

5

UINavigationControllerをサブクラス化し、ナビゲーションごとにシャドウレイヤーを設定するか、バーが常に表示されている場合は、UIWindow(アプリケーション全体で1つだけ)にシャドーを追加してから、サブビュー。

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

あなたは後者を選択した場合は、その後層最前を作るためにdidAddSubviewをオーバーライドします。

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

はそれがお役に立てば幸いです。

+0

これをView Controllerに実装しようとしていて、何も見ていない... – fuzz

+0

ナビゲーションコントローラのインスタンスがありますか?あなたのnavigationBarがゼロになるようです。 – marcio

2

これは簡単にUINavigationControllerのカスタムサブクラスで行います。 UINavigationControllerのビューのレイヤにサブレイヤを追加します:キーは-viewWillAppearを上書きすることである

- (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はUINavigationBarとステータスバーの両方を占めています。 グラデーションレイヤパラメータのクレジットはmarcioになります。

1

CAGradientLayerを描くと、非常に均一ですが、私の意見では、かなり不自然な見える影です。

質問UIView with shadowの回答に基づく別の方法があります。

それが陰影効果を与えるためにCALayerの様々なシャドウプロパティを使用:

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

同じ技術がtabBarControllertabBarで動作します。

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; 
関連する問題