2017-01-21 108 views
0

如何使导航栏和状态栏变模糊(UIBlurEffect)?当我通过单击图像向下滚动(滚动视图)到其他图片时,此图片(在这种情况下是用白色机器)在导航栏下简单地丢失了,并且有必要在该图下可见带有效果UIBlurEffect的导航栏。如何使导航栏和状态栏模糊(UIBlurEffect)? iOS,Swift 3

NO UIBlurEffect

我已经试过这样,但没有奏效:

func addBlurEffect() { 
// Add blur view 
let bounds = self.navigationController?.navigationBar.bounds as CGRect! 
let visualEffectView = UIVisualEffectView(effect: UIBlurEffect(style: .light)) 
visualEffectView.frame = bounds! 
visualEffectView.autoresizingMask = [.flexibleWidth, .flexibleHeight] 
self.navigationController?.navigationBar.addSubview(visualEffectView) 
self.navigationController?.navigationBar.sendSubview(toBack: visualEffectView) 
visualEffectView.isUserInteractionEnabled = false } 

首先,滚动画面时,导航栏下就会消失。
其次,状态栏保持灰色。

Bad UIBlurEffect for NavigationBar, and NO UIBlurEffect for StatusBar

为状态栏不留灰,我试图做到这一点,但在无果=(

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

此外,在AppDelegate中(用Objective-C,他应用程序) didFinishLaunchingWithOptions,我尝试添加这一切仍然是相同的,没有任何变化:

[[UINavigationBar appearance] setBackgroundImage:[[UIImage alloc]init] forBarMetrics:UIBarMetricsDefault]; 
[[UINavigationBar appearance] setShadowImage:[[UIImage alloc]init]]; 
[[UINavigationBar appearance] setBackgroundColor:[UIColor colorWithRed:0.0f green:0.0f blue:0.0f alpha:0.0f]]; 
[[UINavigationBar appearance] setTranslucent:YES]; 

请帮忙解决这个问题,我惹与它周围3天。
对不起,我的英文不好。

回答

5

将背景图像设置为导航栏会有诀窍。在swift 3中,下面的代码适用于我。

let visualEffectView = UIVisualEffectView(effect: UIBlurEffect(style: .light)) 
    visualEffectView.frame = (self.navigationController?.navigationBar.bounds.insetBy(dx: 0, dy: -10).offsetBy(dx: 0, dy: -10))! 
    self.navigationController?.navigationBar.isTranslucent = true 
    self.navigationController?.navigationBar.setBackgroundImage(UIImage(), for: .default) 
    self.navigationController?.navigationBar.addSubview(visualEffectView) 

输出:

enter image description here

+0

谢谢,作品帮我第二行 –

+0

我看不出有任何所有权或按钮任何更多... –

+1

@RayKing我有同样的问题。我在这里找到了解决方案:http://stackoverflow.com/a/27316465 只需在添加效果后添加:self.navigationController?.navigationBar.sendSubviewToBack(visualEffectView)。 –

0

斯威夫特3

由于@Vignesh的答案,@Romain卡隆的评论,我结合自己的代码与下面的代码对我的作品在Swift 3中

let visualEffectView = UIVisualEffectView(effect: UIBlurEffect(style: .light)) 
    visualEffectView.frame = (self.navigationController?.navigationBar.bounds.insetBy(dx: 0, dy: -10).offsetBy(dx: 0, dy: -10))! 
    self.navigationController?.navigationBar.isTranslucent = true 
    self.navigationController?.navigationBar.setBackgroundImage(UIImage(), for: .default) 
    self.navigationController?.navigationBar.addSubview(visualEffectView) 
    self.navigationController?.navigationBar.sendSubview(toBack: visualEffectView) 
0

这是我的这个sa的Objective-C代码我的东西,它包括对iPhone X的超大导航栏的支持。

UIVisualEffectView *fxView = [[UIVisualEffectView alloc] initWithEffect:[UIBlurEffect effectWithStyle:UIBlurEffectStyleLight]]; 
[fxView setFrame:CGRectOffset(CGRectInset(self.navigationController.navigationBar.bounds, 0, -12), 0, -60)]; 
[self.navigationController.navigationBar setTranslucent:YES]; 
[self.navigationController.navigationBar setBackgroundImage:[UIImage new] forBarPosition:UIBarPositionAny barMetrics:UIBarMetricsDefault]; 
[self.navigationController.navigationBar insertSubview:fxView atIndex:1]; 
0

关闭@Vignesh回答这是一个坏主意,以硬编码-10。例如,这将不会正确大小的iPhone X.

// Find size for blur effect. 
let statusBarHeight = UIApplication.shared.statusBarFrame.size.height 
let bounds = self.navigationController?.navigationBar.bounds.insetBy(dx: 0, dy: -(statusBarHeight)).offsetBy(dx: 0, dy: -(statusBarHeight)) 
// Create blur effect. 
let visualEffectView = UIVisualEffectView(effect: UIBlurEffect(style: .light)) 
visualEffectView.frame = bounds 
// Set navigation bar up. 
self.navigationController?.navigationBar.isTranslucent = true 
self.navigationController?.navigationBar.setBackgroundImage(UIImage(), for: .default) 
self.navigationController?.navigationBar.addSubview(visualEffectView) 
self.navigationController?.navigationBar.sendSubview(toBack: visualEffectView) 

我也建议创建一个UINavigationController的子类,因为它是很好的做法。事情是这样的:

final class func MyCustomNavigation: UINavigationController { 

    override func viewDidLoad() { 

     // Find size for blur effect. 
     let statusBarHeight = UIApplication.shared.statusBarFrame.size.height 
     let bounds = navigationBar.bounds.insetBy(dx: 0, dy: -(statusBarHeight)).offsetBy(dx: 0, dy: -(statusBarHeight)) 
     // Create blur effect. 
     let visualEffectView = UIVisualEffectView(effect: UIBlurEffect(style: .light)) 
     visualEffectView.frame = bounds 
     // Set navigation bar up. 
     navigationBar.isTranslucent = true 
     navigationBar.setBackgroundImage(UIImage(), for: .default) 
     navigationBar.addSubview(visualEffectView) 
     navigationBar.sendSubview(toBack: visualEffectView) 

    } 

}