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!