我有像这样呈现MainViewController的AuthViewController:
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()覆盖.状态栏出现时没有动画.
我只能通过将MainViewController上的prefeRSStatusBarHidden设置为true来实现动画,直到viewDidAppear,然后调用:
UIView.animateWithDuration(0.3) { self.setNeedsstatusBarappearanceUpdate() }
我不想每次都打电话.我究竟做错了什么?
解决方法
一直在寻找解决方案.但是,你似乎已经获得了一半的解决方案.你必须为变量设置覆盖,但对我来说最好的做法是为每个覆盖创建一个私有变量对,并让每个覆盖返回它各自的私有变量(见下文).然后,您将更改私有变量并调用setNeedsstatusBarappearanceUpdate.
另外,您需要在info.plist中将基于View控制器的状态栏外观设置为YES.否则,它仍将依赖于传统的UIApplication.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 } }
然后我可以在这样的函数中调用:(这是我的一个例子,所以忽略自定义函数).
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() }) }) }
你最终必须调整每个视图控制器,但它似乎是你想要做的,所以希望它有所帮助!
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 [email protected] 举报,一经查实,本站将立刻删除。