像GameCenter这样的UINavigationbar的阴影效果

时间:2010-12-01 05:25:36

标签: iphone uikit uinavigationbar

我想为像GameCenter这样的UINavigationbar添加阴影效果。

我认为将带有阴影的背景图像应用到导航栏,但标题的行高会降低。 我在背景中绘制阴影,但背景图像不会滚动。

这个案例的最佳实践是什么?

3 个答案:

答案 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