How do I transition/animate color of UINavigationBar?

前端 未结 2 511
再見小時候
再見小時候 2021-02-01 02:52

I have been searching for how to transition/animate the barTintColor of a UINavigationBar for a while now, and I only see different answers. Some use <

2条回答
  •  野的像风
    2021-02-01 03:28

    in 10 iOS it works imperfectly :(

    Subclass your navigation controller to use statusbarstyle of visible view controller:

    class MyNavigationController: UINavigationController {
        override var preferredStatusBarStyle: UIStatusBarStyle {
            return visibleViewController!.preferredStatusBarStyle
        }
    }
    

    Override preferredStatusBarStyle in Root controller and add function to set styles before pop animation:

    private var _preferredStyle = UIStatusBarStyle.default;
    override var preferredStatusBarStyle: UIStatusBarStyle {
        get {
            return _preferredStyle
        }
        set {
            _preferredStyle = newValue
            self.setNeedsStatusBarAppearanceUpdate()
        }
    
    }
    
    
    func animateNavigationColors(){
            self.setBeforePopNavigationColors()
            transitionCoordinator?.animate(alongsideTransition: { [weak self](context) in
                self?.setNavigationColors()
                }, completion: nil)
        }
    
    func setBeforePopNavigationColors() {
        //Override in subclasses
    }
    

    In first controller:

    override func setBeforePopNavigationColors() {
        navigationController?.navigationBar.tintColor = UIColor.white
        navigationController?.navigationBar.titleTextAttributes = [NSAttributedStringKey.foregroundColor: UIColor.white]
        self.preferredStatusBarStyle = UIStatusBarStyle.lightContent
    }
    
    override func setNavigationColors(){
        navigationController?.navigationBar.barTintColor = UIColor.white
        navigationController?.navigationBar.tintColor = UIColor.black
        navigationController?.navigationBar.titleTextAttributes = [NSAttributedStringKey.foregroundColor: UIColor.black]
        navigationController?.navigationBar.barStyle = UIBarStyle.default
        self.preferredStatusBarStyle = UIStatusBarStyle.default
    }
    

    In second:

      override func setNavigationColors(){
            navigationController?.navigationBar.barTintColor = UIColor.black
            navigationController?.navigationBar.tintColor = UIColor.white
            navigationController?.navigationBar.titleTextAttributes = [NSAttributedStringKey.foregroundColor: UIColor.white]
            navigationController?.navigationBar.barStyle = UIBarStyle.black
            self.preferredStatusBarStyle = UIStatusBarStyle.lightContent
        }
    

    Example project: https://github.com/josshad/TestNavBarTransition

提交回复
热议问题