我想为像GameCenter这样的UINavigationbar添加阴影效果。
我认为将带有阴影的背景图像应用到导航栏,但标题的行高会降低。 我在背景中绘制阴影,但背景图像不会滚动。
这个案例的最佳实践是什么?
答案 0 :(得分:5)
您可以为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];
希望它有所帮助。
答案 1 :(得分: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。
答案 2 :(得分: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;
}
同样的技巧适用于tabBarController
的{{1}};
tabBar