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

Real time blur effect for Navigation Bar - Status bar not getting in

按照this question在导航栏中获得实时模糊效果:

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早前的回答,原贴是here

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

Swift 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)
}