您可以使用動畫對導航欄的高度進行更改,方法是對其進行子類化並創建高度屬性(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
}
}