preferredStatusBarUpdateAnimation被忽略

Cod*_*ton 6 uiviewcontroller uiviewanimation uistatusbar swift

我有AuthViewController这样的表现MainViewController:

let mainVC = MainViewContoller()
mainVC.modalTransitionStyle = .CrossDissolve
authVC.presentViewController(mainVC, animated: true, completion: nil)
Run Code Online (Sandbox Code Playgroud)

我希望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
    }
}
Run Code Online (Sandbox Code Playgroud)

将显示状态栏,但preferredStatusBarUpdateAnimation()忽略覆盖.状态栏出现时没有动画.

我只能够得到它通过设置动画prefersStatusBarHiddenMainViewControllertrue直到viewDidAppear,则调用此:

UIView.animateWithDuration(0.3) {
    self.setNeedsStatusBarAppearanceUpdate()
}
Run Code Online (Sandbox Code Playgroud)

我不想每次都打电话.我究竟做错了什么?

jlm*_*rph 5

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

另外,您需要在toView controller-based status bar appearance中设置。否则,它仍然会依赖遗留方法。info.plistYESUIApplication.shared...

这是一个片段:

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
    }
}
Run Code Online (Sandbox Code Playgroud)

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

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()
        })
    })
}
Run Code Online (Sandbox Code Playgroud)

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