Ответ 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
.