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;

同样的技术适用于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;

【讨论】:

以上是关于UINavigationbar 的阴影效果,如 GameCenter的主要内容,如果未能解决你的问题,请参考以下文章

如何将附加的阴影添加到 uinavigationbar 和 uitoolbar

UINavigationbar 通过外观设置阴影不起作用

如何使用 UISearchController 移除 UINavigationBar 下方的阴影

模拟 UINavigationBar 标题的阴影偏移和颜色值是多少?

如何用CSS实现DIV块的阴影效果

如何用CSS实现DIV块的阴影效果