UINavigationbar 的阴影效果,如 GameCenter
Posted
技术标签:
【中文标题】UINavigationbar 的阴影效果,如 GameCenter【英文标题】:shadow effect for UINavigationbar like GameCenter 【发布时间】:2010-12-01 05:25:36 【问题描述】:我想为 UINavigationbar 添加阴影效果,例如 GameCenter。
我认为将带阴影的背景图像应用于导航栏,但标题的行高会降低。 我在背景上绘制阴影,但背景图像不会滚动。
这个案例的最佳实践是什么??
【问题讨论】:
【参考方案1】:您可以继承 UINavigationController,然后为每个导航设置一个阴影层,或者如果您的栏始终可见,只需将阴影添加到 UIWindow(整个应用程序只有一个),然后每次添加子视图时使其成为最前面的视图.
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];
希望对你有帮助。
【讨论】:
确定有一个导航控制器实例?您的 navigationBar 似乎指向 nil。【参考方案2】:使用 UINavigationController 的自定义子类可以轻松完成。关键是覆盖 -viewWillAppear: 并将子层添加到 UINavigationController 的视图层:
- (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。
【讨论】:
【参考方案3】:绘制一个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;
【讨论】:
以上是关于UINavigationbar 的阴影效果,如 GameCenter的主要内容,如果未能解决你的问题,请参考以下文章
如何将附加的阴影添加到 uinavigationbar 和 uitoolbar
如何使用 UISearchController 移除 UINavigationBar 下方的阴影