GameCenterのようなUINavigationbarにシャドウエフェクトを追加したい。GameCenterのようなUINavigationbarのシャドーエフェクト
私は、影のナビゲーションバーを使って背景画像を適用すると思いますが、タイトルの行の高さは下がります。 背景に影を描きますが、背景の画像はスクロールしません。
このケースのベストプラクティスは何ですか?
GameCenterのようなUINavigationbarにシャドウエフェクトを追加したい。GameCenterのようなUINavigationbarのシャドーエフェクト
私は、影のナビゲーションバーを使って背景画像を適用すると思いますが、タイトルの行の高さは下がります。 背景に影を描きますが、背景の画像はスクロールしません。
このケースのベストプラクティスは何ですか?
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];
はそれがお役に立てば幸いです。
これは簡単に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になります。
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;
}
同じ技術がtabBarController
の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;
これをView Controllerに実装しようとしていて、何も見ていない... – fuzz
ナビゲーションコントローラのインスタンスがありますか?あなたのnavigationBarがゼロになるようです。 – marcio