导航栏的实时模糊效果 – 状态栏无法进入

按照这个问题在导航栏中获得实时模糊效果:

func addBlurEffect() { var bounds = self.navigationController?.navigationBar.bounds as CGRect! var visualEffectView = UIVisualEffectView(effect: UIBlurEffect(style: .Light)) as UIVisualEffectView visualEffectView.frame = bounds visualEffectView.autoresizingMask = .FlexibleHeight | .FlexibleWidth self.navigationController?.navigationBar.addSubview(visualEffectView) } 

但状态栏仍然是半透明的:

在此处输入图像描述

怎么解决?


调试:

  print(self.navigationController?.navigationBar.bounds) // Returns (0.0, 0.0, 320.0, 44.0) print(UIApplication.sharedApplication().statusBarFrame) // Returns (0.0, 0.0, 320.0, 20.0) 

部分原因是您将视觉效果视图的框架设置为导航栏的边界。 你在屏幕截图看到的导航栏的界限。 因此,您可以通过为视觉效果视图提供不同的帧来进行补偿,即将其原点向上移动20个点并增加其高度。

但是,对我来说有点不清楚,为什么你不只是让导航栏半透明。 导航栏半透明模糊效果,并且受支持。 你正在做什么 – 在导航栏中添加子视图 – 不是。

管理以使其工作添加此:

 bounds.offsetInPlace(dx: 0.0, dy: -20.0) bounds.size.height = bounds.height + 20.0 

至于这个问题,我已经修改了Kampai早期的答案,原文发布在这里 。

下面的代码会模糊状态栏和导航栏。

斯威夫特4:

 func navigationBarBlur() { let bounds = CGRect(x: 0.0, y: -20.0, width: UserDefaults.screenWidth, height: (self.navigationController?.navigationBar.bounds.size.height)! + 20.0) let visualEffectView = UIVisualEffectView(effect: UIBlurEffect(style: .dark)) self.visualEffectView = visualEffectView visualEffectView.frame = bounds visualEffectView.autoresizingMask = [.flexibleWidth, .flexibleHeight] self.navigationController?.navigationBar.addSubview(visualEffectView) }