代码之家  ›  专栏  ›  技术社区  ›  Alexander Khitev

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

  •  2
  • Alexander Khitev  · 技术社区  · 7 年前

    在iMessage(iOS 10)中,如何通过动画增加导航栏的高度,当该控制器隐藏时,如何通过动画返回之前的高度?

    我读了几篇文章,我可以在这里分享,但它们没有iMessage(iOS 10)中的效果。非常感谢。

    更新: 或者如何追踪 UIViewController viewWillDisappear NavigationBar 相对于当前控制器已隐藏的百分比的高度。如何更好地实施它?

    2 回复  |  直到 7 年前
        1
  •  3
  •   Lloyd Keijzer    7 年前

    您可以使用动画更改导航栏的高度,方法是对其进行子类化,创建高度属性(barHeight),并在设置值后设置其动画。

    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
        }
    }
    
        2
  •  0
  •   DanMunoz    7 年前

    为了在与过渡完全相同的时间为条的高度设置动画,必须在上实现此方法 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
        })