您可以使用动画对导航栏的高度进行更改,方法是对其进行子类化并创建高度属性(barHeight)并在设置值之后为其设置动画效果。
斯威夫特3
final class CustomHeightNavigationBar: UINavigationBar {
var navigationItemsOffset: CGPoint = CGPoint(x: 0, y: 10) { // default offset (below statusbar)
didSet {
UIView.animate(withDuration: 0.25) { [weak self] in
self?.setNeedsLayout()
}
}
}
var barHeight: CGFloat = 60 { // default height
didSet {
UIView.animate(withDuration: 0.25) { [weak self] in
self?.sizeToFit()
self?.setNeedsLayout()
}
}
}
override func sizeThatFits(_ size: CGSize) -> CGSize {
return CGSize(width: UIScreen.main.bounds.size.width, height: barHeight)
}
override func layoutSubviews() {
super.layoutSubviews()
frame.origin = navigationItemsOffset
subviews.forEach { (subview) in
subview.center.y = center.y
}
}
创建你已经将其设置为在故事板的导航栏,它位于导航控制器的自定义类子类之后。
现在,你可以通过改变barHeight属性的值进行动画视图控制器中的导航栏的高度。
斯威夫特3
var navigationBar: CustomHeightNavigationBar? {
guard let navigationBar = navigationController?.navigationBar as? CustomHeightNavigationBar else {
return nil
}
return navigationBar
}
override func viewWillAppear(_ animated: Bool) {
super.viewWillAppear(animated)
if let navigationBar = navigationBar {
navigationBar.barHeight = 60
}
}
override func viewWillDisappear(_ animated: Bool) {
super.viewWillDisappear(animated)
if let navigationBar = navigationBar {
navigationBar.barHeight = 44
}
}