イケイケな画面遷移を作りたい事、よくあると思います。
Facebookのインタラクティブな画面遷移アニメーションは使っててとってもきもちいいですね。
StatusBarの色が変わらない!
また、画面遷移をカスタマイズする際に、StatusBarの文字色を動的に変更する事もよくある、と思います。
いろいろな諸事情のため、iOS7,iOS8両方対応しなければならなかったけども、
どうも iOS7の時だけ、StatusBarの文字色が動的(各画面毎)に変更ができない!
調べてみた所、UIWindowのrootViewControllerはうまく更新がされているみたい。
そして、遷移先のUIViewControllerにてsetNeedsStatusBarAppearanceUpdate()を呼ぶと、
rootViewControllerのpreferredStatusBarStyle()が呼ばれるみたいです。謎でした
こちらがStatusBarの更新がうまくいかなかったUIViewControllerです。
required init(coder aDecoder: NSCoder) {
super.init(coder: aDecoder)
// Set Custom Transition Style
self.modalPresentationStyle = .Custom
self.transitioningDelegate = transDelegate
}
override func viewDidLoad() {
super.viewDidLoad()
// Update Statusbar Style
setNeedsStatusBarAppearanceUpdate()
}
// Override Statusbar Style
override func preferredStatusBarStyle() -> UIStatusBarStyle {
return .LightContent
}
modalPresentationCapturesStatusBarAppearance
問題はこれです。UIViewControllerのプロパティである
modalPresentationCapturesStatusBarAppearance。
遷移元のStatusBarAppearanceを遷移先で上書きするかどうかがBool値で定義できます。
ドキュメントをちゃんと見てみると、modalPresentationStyleがUIModalPresentationFullScreenでない限り、デフォルトでfalseが定義されているみたいです。
上記の処理は以下のようにすればうまくいくようです。
required init(coder aDecoder: NSCoder) {
super.init(coder: aDecoder)
// Set Custom Transition Style
self.modalPresentationStyle = .Custom
self.transitioningDelegate = transDelegate
// Takeover StatusBar Appearance
self.modalPresentationCapturesStatusBarAppearance = true
}
結論
結果的には、通常のモーダル表示のような全画面が切り替わるような時には、
modalPresentationStyleに.Customを指定しない方がスマートっぽいです。
遷移前のStatusBarStyleに左右されない、例えばUIAlertControllerのような画面遷移をする場合には.Customを指定し、
全画面差し代わるTransitionの場合は.FullScreenを指定し、各画面毎にStatusBarStyleを指定するようにしています。