【问题标题】:preferredStatusBarUpdateAnimation being ignoredpreferredStatusBarUpdateAnimation 被忽略
【发布时间】:2016-09-26 10:19:24
【问题描述】:

我有 AuthViewController 正在呈现 MainViewController,如下所示:

let mainVC = MainViewContoller()
mainVC.modalTransitionStyle = .CrossDissolve
authVC.presentViewController(mainVC, animated: true, completion: nil)

我希望 AuthViewController 隐藏状态栏,但 MainViewController 显示,如下所示:

AuthViewController {

    override func preferredStatusBarStyle() -> UIStatusBarStyle {
        return .LightContent
    }

    override func preferredStatusBarUpdateAnimation() -> UIStatusBarAnimation {
        return .Fade
    }

    override func prefersStatusBarHidden() -> Bool {
        return false
    }
}

MainViewController {

    override func preferredStatusBarStyle() -> UIStatusBarStyle {
        return .LightContent
    }

    override func preferredStatusBarUpdateAnimation() -> UIStatusBarAnimation {
        return .Fade
    }

    override func prefersStatusBarHidden() -> Bool {
        return false
    }
}

出现状态栏,但忽略 preferredStatusBarUpdateAnimation() 覆盖。状态栏出现,没有动画。

我只能通过将prefersStatusBarHidden 上的MainViewController 设置为true 直到viewDidAppear,然后调用它:

UIView.animateWithDuration(0.3) {
    self.setNeedsStatusBarAppearanceUpdate()
}

我不想每次都调用它。我做错了什么?

【问题讨论】:

    标签: swift uiviewcontroller uiviewanimation uistatusbar


    【解决方案1】:

    也一直在寻找解决方案。但是,您似乎已经获得了一半的解决方案。您必须为变量设置覆盖,但对我来说,最佳实践是为每个覆盖创建一个私有变量对,并让每个覆盖返回它各自的私有 var(见下文)。然后更改私有变量并调用setNeedsStatusBarAppearanceUpdate

    另外,您需要将info.plist 中的View controller-based status bar appearance 设置为YES。否则,它仍将依赖于旧的 UIApplication.shared... 方法。

    这是一个sn-p:

    override var preferredStatusBarUpdateAnimation: UIStatusBarAnimation {
        get {
            return .slide
        }
    }
    
    private var statusBarStyle : UIStatusBarStyle = .default
    
    override var preferredStatusBarStyle: UIStatusBarStyle {
        get {
            return statusBarStyle
        }
    }
    
    private var statusBarStatus : Bool = false
    
    override var prefersStatusBarHidden: Bool {
        get {
            return statusBarStatus
        }
    }
    

    然后我可以在这样的函数中调用它:(这是我的示例之一,因此请忽略自定义函数)。

    func sliderView(sliderView: SliderView, didSlideToPlace: CGFloat, within: CGFloat) {
    
        let val = (within - (didSlideToPlace - sliderView.upCent))/(within)
        print(val)
        //Where you would change the private variable for the color, for example.
        if val > 0.5 {
            statusBarStyle = .lightContent
        } else {
            statusBarStyle = .default
        }
        UIView.animate(withDuration: 0.5, animations: {
            sliderView.top.backgroundColor = UIColor.black.withAlphaComponent(val)
            self.coverLayer.alpha = val
            self.scroll.backgroundColor = colors.lightBlueMainColor.withAlphaComponent(val)
        }, completion: {
            value in
            //If you do not call setNeedsStatusBarAppearanceUpdate() in an animation block, the animation variable won't be called it seems.
            UIView.animate(withDuration: 0.4, animations: {
    
                self.animating = true
    
                //Where you set the status for the bar (your part of the solution)
                self.statusBarStatus = false
    
                //Then you call for the refresh
                self.setNeedsStatusBarAppearanceUpdate()
            })
        })
    }
    

    您最终不得不调整每个视图控制器,但这似乎是您想要做的,所以希望它有所帮助!

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2016-06-05
      • 2014-02-25
      • 2011-05-09
      • 2015-02-08
      • 2011-03-27
      • 2010-11-19
      • 2018-01-18
      相关资源
      最近更新 更多