2017-01-21 109 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) 

    } 

}