Сообщения, подобные более высокой/стандартной навигационной панели во время push/pop

iOS 10 Сообщения на панели навигации приложений увеличивают/уменьшают высоту, когда вы нажимаете/открываете разговор (с плавным переходом).

Как правило, я делаю более высокую настраиваемую навигационную панель с помощью sizeThatFits:, но она сохраняется в точках и попках контроллеров вида в контроллере навигации.

Как можно иметь более высокую навигационную панель только для некоторых контроллеров представлений в навигационных последовательностях, таких как приложение "Сообщения"? Спасибо!

Ответы

Ответ 1

Очень интересная проблема. Я потратил некоторое время на достижение чего-то вроде приложения "Сообщения", и это то, что я сделал.

введите описание изображения здесь

Наконец, я использую этот трюк для анимации navigationBar heigh во время push/pop, а также pop с жестом салфетки.

UIView.beginAnimations(nil, context: nil)
self.frame = navFrame
UIView.commitAnimations()

Ниже вы можете увидеть мою реализацию:

extension UINavigationBar {
    func applyHeight(_ height: CGFloat, animated: Bool = true) {
        var navFrame = self.frame
        navFrame.size.height = height
        if animated {
            UIView.beginAnimations(nil, context: nil)
            self.frame = navFrame
            UIView.commitAnimations()
        } else {
            self.frame = navFrame
        }
    }
}

class ViewControllerA: UIViewController {

    override func loadView() {
        super.loadView()
        title = "A"
        view.backgroundColor = .blue
        navigationItem.rightBarButtonItem = UIBarButtonItem(title: "NEXT", style: .plain, target: self, action: #selector(self.showController))
        navigationController?.navigationBar.isTranslucent = false
    }

    override func viewWillAppear(_ animated: Bool) {
        super.viewWillAppear(animated)
    }

    func showController() {
        navigationController?.pushViewController(ViewControllerB(), animated: true)
    }
}

class ViewControllerB: UIViewController {

    override func loadView() {
        super.loadView()
        title = "B"
        view.backgroundColor = .red
    }

    override func viewWillAppear(_ animated: Bool) {
        navigationController?.navigationBar.applyHeight(100)
        super.viewWillAppear(animated)
    }

    override func willMove(toParentViewController parent: UIViewController?) {
        if parent == nil { // here you know that back button was tapped
            navigationController?.navigationBar.applyHeight(44)
        }
        super.willMove(toParentViewController: parent)
    }
}

Что улучшить

  • Заголовок переходит в начало

Прыгающий заголовок видимый, пока вы садитесь, чтобы поп, но лично я думаю, что это небольшая проблема:)

Надеюсь, это поможет вам, и, возможно, кто-то может улучшить эту реализацию. Конечно, я все еще пытаюсь выяснить, как сделать это лучше:) Здесь это репозиторий github. Используйте ветку navigation_bar_height.