Предпочитаемое игнорирование StatusBarUpdateAnimation
Я имею 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()
}
Я не хочу называть это каждый раз. Что я делаю неправильно?
1 ответ
Искал решение этого тоже. Однако, похоже, вы уже получили половину решения. Вы должны установить переопределения для переменных, но для меня лучше всего было создать пару приватных переменных для каждого из переопределений, и чтобы каждое переопределение возвращало соответствующую приватную переменную (см. Ниже). Затем вы измените приватные переменные и вызовете setNeedsStatusBarAppearanceUpdate
,
Плюс нужно установить View controller-based status bar appearance
в вашем info.plist
в 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()
})
})
}
В конечном итоге вам приходится настраивать каждый контроллер представления, но кажется, что это то, что вы хотите сделать, так что надеюсь, что это поможет!