通常来说,我们如果想要设置导航栏透明有两种方法:
1. 通过设置 setBackgroundImage:forBarMetrics 和shadowImage。
[self.navigationController.navigationBar setBackgroundImage:[UIImage new] forBarMetrics:UIBarMetricsDefault];
self.navigationController.navigationBar.shadowImage = [UIImage new];
2.通过设置导航栏imageView子视图的alpha。
// navigationBar上的subviews的第一个视图即为我们要的字视图
self.navigationController.navigationBar.subviews.firstObject.alpha = 0;
可是试过的同学都发现在iOS11上突然失效了,这是因为iOS11的导航栏视图结构发生了变化。需要做个判断 代码如下:
if (@available(iOS 11.0, *)) {
[[[[self.navigationController.navigationBar subviews] objectAtIndex:0] subviews] objectAtIndex:1].alpha = 0;
[[[[[self.navigationController.navigationBar subviews] objectAtIndex:0] subviews] objectAtIndex:0] setHidden:YES];
}else {
self.navigationController.navigationBar.subviews.firstObject.alpha = 0;
}
同时第二种方法可用于动态改变导航栏透明度。比如说进去视图的时候,导航栏是透明的,随着tableview的滑动,导航栏渐渐变得不透明,有个颜色的渐变效果。可以在 scrollViewDidScroll: 中设置 代码如下:
- (void)scrollViewDidScroll:(UIScrollView *)scrollView {
CGFloat minAlphaOffset = -64;
CGFloat maxAlphaOffset = 500;
CGFloat offset = scrollView.contentOffset.y;
CGFloat alpha = (offset - minAlphaOffset)/(maxAlphaOffset-minAlphaOffset);
if (@available(iOS 11.0, *)) {
[[[[self.navigationController.navigationBar subviews] objectAtIndex:0] subviews] objectAtIndex:1].alpha = alpha;
[[[[[self.navigationController.navigationBar subviews] objectAtIndex:0] subviews] objectAtIndex:0] setHidden:YES];
} else {
self.navigationController.navigationBar.subviews.firstObject.alpha = alpha;
}
}
demo地址: