iMessage中的导航栏高度(iOS 10)

时间:2017-07-26 12:33:30

标签: ios swift animation navigationbar

如何使用动画在iMessage(iOS 10)中增加导航栏高度,并且当隐藏此控制器时,还会使用动画返回之前的高度?

我阅读了几篇文章,我可以在这里分享,但是它们没有像iMessage(iOS 10)那样产生效果。谢谢。

更新或者如何跟踪UIViewController隐藏在点上以制作流畅的动画,因为我们收到控制器开始隐藏的viewWillDisappear调用,但也可能是用户用慢手势隐藏它,因此有必要相对于当前控制器已经隐藏的百分比来减少NavigationBar高度。如何更好地实施它?

2 个答案:

答案 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
    }
}

创建子类后,您必须将其设置为故事板中导航栏的自定义类,该导航栏位于导航控制器中。

enter image description here

现在,您可以通过更改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)

我认为你在寻找的是: 为了在转换的同一时间设置条形高度的动画,您必须在viewWillAppearviewWillDisappear

上实现此方法
        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
    })