2017-01-21 2 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 } 

Во-первых, при прокрутке картина просто исчезает под панели навигации.
Во-вторых, Status Bar остается серым.

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

Настройка фонового изображения на панель навигации делает трюк. В быстром 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

Swift 3

Благодаря 's ответ и @Romain Caron' @Vignesh комментарий s, я объединил свой код и следующий код работает для меня in 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

Вот мой код Objective-C для этого sa я, и это включает поддержку сверхбольшой навигационной панели 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) 

    } 

} 
Смежные вопросы