Как изменить навигационную панель обратно на полупрозрачную, сделав ее прозрачной - PullRequest
0 голосов
/ 09 мая 2019

В моем стеке навигации есть контроллер представления, который должен иметь прозрачную панель навигации, в то же время показывая кнопку возврата.

Я могу добиться этого с помощью одной строки кода внутри viewWillAppear:

self.navigationController?.navigationBar.setBackgroundImage(UIImage(), for: .default)

Однако, когда я пытаюсь вернуться к предыдущему виду, я устанавливаю фоновое изображение обратно на nil или .none, но теряю эффект полупрозрачности, который был ранеетам, когда я это делаю.

Я попытался установить все следующие параметры в viewWillDisappear, и ни один из них, похоже, не возвращает прозрачность обратно.Это просто кажется белым независимо от того, что я делаю.Тень внизу также исчезла:

self.navigationController?.navigationBar.isTranslucent = true
self.navigationController?.navigationBar.barStyle = .default
self.navigationController?.navigationBar.backgroundColor = .none
self.navigationController?.navigationBar.setBackgroundImage(.none, for: .default)

Начальная панель навигации:

Initial Navigation Bar

Прозрачная панель навигации:

Transparent Navigation Bar

После перехода назад:

After Transitioning Back

Ответы [ 2 ]

1 голос
/ 09 мая 2019

В viewWillAppear сделать панель навигации прозрачной

override func viewWillAppear(_ animated: Bool) {        self.navigationController?.navigationBar.setBackgroundImage(UIImage(), for: .default)
    self.navigationController?.navigationBar.shadowImage = UIImage()
    self.navigationController?.navigationBar.isTranslucent = true
}

И фоновый полупрозрачный viewWillDisappear

override func viewWillDisappear(_ animated: Bool) {
    self.navigationController?.navigationBar.setBackgroundImage(nil, for: .default)
    self.navigationController?.navigationBar.shadowImage = nil
    self.navigationController?.navigationBar.isTranslucent = false
}
0 голосов
/ 04 июня 2019

Проведя время, разбираясь во внутренних элементах UINavigationBar, я обнаружил простой метод, который, кажется, работает, и не требует какой-либо настройки стандартных атрибутов UINavigationBar, с которыми мы ранее манипулировали для достижения прозрачности.Следующие тесты работают на iOS 12.2.x:

class TallNavigationBar: UINavigationBar {

    private lazy var maskingView: UIView = {
        let view = UIView(frame: bounds)
        view.backgroundColor = .clear
        return view
    }()

    var isTransparent = false {
        didSet {
            guard isTransparent != oldValue, let bkgView = subviews.first else { return }

            bkgView.mask = isTransparent ? maskingView : nil
        }
    }
}

Очевидно, что всякий раз, когда возитесь (даже слегка) с недокументированными внутренностями: используйте на свой страх и риск!

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...