preferredStatusBarUpdateAnimation 被忽略 [英] preferredStatusBarUpdateAnimation being ignored

查看:43
本文介绍了preferredStatusBarUpdateAnimation 被忽略的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我有 AuthViewController 呈现 MainViewController 像这样:

I have AuthViewController that is presenting MainViewController like so:

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

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

I want the AuthViewController to hide the status bar, but the MainViewController to show, like so:

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() 覆盖.状态栏出现时没有动画.

The status bar appears, however the preferredStatusBarUpdateAnimation() override is ignored. The status bar appears with no animation.

我只能通过将 MainViewController 上的 prefersStatusBarHidden 设置为 true 直到 viewDidAppear 设置动画>,然后调用这个:

I have only been able to get it to animate by setting prefersStatusBarHidden on MainViewController to true until the viewDidAppear, then calling this:

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

我不想每次都调用这个.我做错了什么?

I don't want to have to call this every time. What am I doing wrong?

推荐答案

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

been searching for a solution to this too. However it seems you got half the solution already. You have to set up the overrides for the variables, but best practice for me was to create a private variable pair for each of the overrides, and have each override return it's respective private var (see bellow). You'd then change up the private variables and call setNeedsStatusBarAppearanceUpdate.

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

Plus, you need to set View controller-based status bar appearance in your info.plist to YES. Otherwise, it will still rely on the legacy UIApplication.shared... methods.

这是一个片段:

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
    }
}

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

which I then could call in a function like so: (this is one of my examples, so disregard the custom function).

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()
        })
    })
}

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

You end up having to tune every view controller, but it seems like it's what you want to do, so hope it helps!

这篇关于preferredStatusBarUpdateAnimation 被忽略的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆