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

Navigation bar height as in iMessage (iOS 10)

如何在 iMessage 中增加导航栏的高度 (iOS 10),带动画,当这个控制器被隐藏时,然后还带动画 return 以前的高度?

我看了好几篇文章,我可以在这里分享它们,但它们没有像 iMessage 中那样的效果 (iOS 10)。谢谢。

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

您可以使用动画更改导航栏的高度,方法是对导航栏进行子class处理并为高度 (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
    }
}

创建子class后,您必须将其设置为情节提要中导航栏的自定义class,它位于导航控制器中。

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

我想你要找的是这个: 为了在过渡的同时为条形图的高度设置动画,您必须在 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
    })