如何使用动画在iMessage(iOS 10)中增加导航栏高度,并且当隐藏此控制器时,还会使用动画返回之前的高度?
我阅读了几篇文章,我可以在这里分享,但是它们没有像iMessage(iOS 10)那样产生效果。谢谢。
更新或者如何跟踪UIViewController
隐藏在点上以制作流畅的动画,因为我们收到控制器开始隐藏的viewWillDisappear
调用,但也可能是用户用慢手势隐藏它,因此有必要相对于当前控制器已经隐藏的百分比来减少NavigationBar
高度。如何更好地实施它?
答案 0 :(得分:2)
您可以通过对动画进行子类化并为高度创建属性(barHeight)并在设置值后设置动画来更改导航栏的高度。
Swift 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属性的值来为视图控制器中导航栏的高度设置动画。
Swift 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
}
}
答案 1 :(得分:0)
我认为你在寻找的是:
为了在转换的同一时间设置条形高度的动画,您必须在viewWillAppear
和viewWillDisappear
self.transitionCoordinator?.animate(alongsideTransition: { (context) in
let height: CGFloat = 80 //any size you want
let bounds = self.navigationController!.navigationBar.bounds
self.navigationController?.navigationBar.frame = CGRect(x: 0, y: 0, width: bounds.width, height: height)
}, completion: { (context) in
//Any code you may want to add after the transition
})