iOS - 关于设置导航栏透明度的问题,做个总结。

通常来说,我们如果想要设置导航栏透明有两种方法:

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地址:

https://github.com/WisdomWang/NavChange

你可能感兴趣的:(iOS - 关于设置导航栏透明度的问题,做个总结。)