推送/弹出期间类似消息的更高/标准导航栏
Messages-like taller / standard navigation bar during push / pop
iOS 10 Messages 应用程序的导航栏 increases/decreases 当您 push/pop 对话时的高度(平滑过渡)。
通常我会使用 sizeThatFits:
制作一个更高的自定义导航栏,但它会在导航控制器中的视图控制器的推送和弹出过程中持续存在。
如何才能为某些跨导航序列的视图控制器(如“消息”应用)设置更高的导航栏?
谢谢!
非常有趣的问题。我花了一些时间在消息应用程序中实现了类似的功能,这就是我所做的。
最后,我使用这个技巧在 push/pop 期间为 navigationBar 高度设置动画,并使用滑动手势弹出。
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 repository。请使用 navigation_bar_height
分支。
我想现在你可以用这个实现类似的东西,只需将大标题设置为始终:
iOS 10 Messages 应用程序的导航栏 increases/decreases 当您 push/pop 对话时的高度(平滑过渡)。
通常我会使用 sizeThatFits:
制作一个更高的自定义导航栏,但它会在导航控制器中的视图控制器的推送和弹出过程中持续存在。
如何才能为某些跨导航序列的视图控制器(如“消息”应用)设置更高的导航栏? 谢谢!
非常有趣的问题。我花了一些时间在消息应用程序中实现了类似的功能,这就是我所做的。
最后,我使用这个技巧在 push/pop 期间为 navigationBar 高度设置动画,并使用滑动手势弹出。
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 repository。请使用 navigation_bar_height
分支。
我想现在你可以用这个实现类似的东西,只需将大标题设置为始终: