清除背景色的导航栏,但仍然浮动在所有内容之上

我是一个新的iOS开发人员,我发现一些应用程序可以有一个完全透明的导航栏,但仍然漂浮在所有的内容,如应用程序有一个非常漂亮的背景图片,导航栏是透明的,所以你可以看到整个背景,但导航视图控制器上有一个滚动视图。 当滚动时,它仍然在导航栏下。

当我尝试它,我设置我的导航栏背景像这样透明

[self.navigationController.navigationBar setBackgroundImage:[self imageWithColor:[UIColor clearColor]] forBarMetrics:UIBarMetricsDefault]; 

但我的滚动视图将完全可见,当它在导航栏下。 我不喜欢那个,是否有人知道如何使导航栏透明,但仍然漂浮在一切?

谢谢你们的声誉,这里是来自雅虎的屏幕截图,他们的导航栏完全是我想要的。

在这里输入图像说明

但是当我为它设置清晰的背景时,就变成这样了。

在这里输入图像说明

我不是100%确定雅虎如何做到这一点,但我可以假装像这样的效果

在这里输入图像说明

我受到BTGlassScrollView( https://github.com/BTLibrary/BTGlassScrollView )的启发,我使用的方法有以下几个步骤:

1.>像这样设置你的导航控制器:

  • 先把你的背景图像视图
  • 然后为你的滚动视图添加一个包装视图,并将包装视图的背景设置为透明(这个包装视图非常重要,我们必须在这个包装视图上伪装效果)
  • 将滚动视图拖动到包装视图中,并将滚动视图背景设置为“透明”。

在这里输入图像说明

2.>设置滚动视图,包装视图和背景图像视图的所有网点

3.>您可能还想隐藏导航栏阴影图像,这里是代码,以防万一,如果你需要它

  self.navigationController.navigationBar.shadowImage = [[UIImage alloc] init]; 

4.>然后将这个方法粘贴到你的类中

 - (CALayer *)createViewMaskWithSize:(CGSize)size startGradientAt:(CGFloat)start endGradientAt:(CGFloat)end { CAGradientLayer *mask = [CAGradientLayer layer]; mask.anchorPoint = CGPointZero; mask.startPoint = CGPointMake(0.5f, 0.0f); mask.endPoint = CGPointMake(0.5f, 1.0f); mask.colors = @[(id)[UIColor clearColor].CGColor, (id)[UIColor clearColor].CGColor, (id)[UIColor whiteColor].CGColor, (id)[UIColor whiteColor].CGColor]; mask.locations = @[@0.0, @(start/size.height), @(end/size.height), @1.0f]; mask.frame = CGRectMake(0, 0, size.width, size.height); return mask; } 

此方法的目的是创build一个带有清晰到白色渐变的遮罩层。

5.>最后一步,简单地添加到你的wrapperView.layer.mask这样

  // 64 in here is the position where the fade effect should start, and 80 is where the gradien should end // you can change those 2 numbers and see different effects self.scrollViewWrapperView.layer.mask = [self createViewMaskWithSize:self.scrollViewWrapperView.frame.size startGradientAt:64 endGradientAt:80]; 

包装视图是这种情况下的关键,如果没有它,导航栏将无法正常工作。 并记住不要将背景图像视图放入包装视图中,它们应该位于同一层,而是包装视图下的背景图像。

这是一个非常粗糙的模拟ups,但希望这给你一些想法。