iOS 7移行ガイドUIStatusBarStyle
でUIViewController
を動的に変更する方法についての良いヒントを
_- (UIStatusBarStyle)preferredStatusBarStyle {
return UIStatusBarStyleDefault;
}
_
_[self setNeedsStatusBarAppearanceUpdate];
_と一緒に
これは、シングルビューアプリケーションで正常に機能します。ただし、現在、モーダルビューのUIStatusBarStyle
をUIStatusBarStyleLightContent
に変更しようとしています。 MainViewController
に続くModalViewController
があり、それ自体はNavigationController
に埋め込まれています。 ModalViewController
はデリゲートをMainViewController
に設定しました。
ModalViewController
の_[self setNeedsStatusBarAppearanceUpdate];
_を、そのクラスの次のメソッドと一緒に呼び出しようとしましたが、効果はありませんでした。
_// In ModalViewController.m
- (UIStatusBarStyle)preferredStatusBarStyle {
return UIStatusBarStyleLightContent;
}
_
また、モーダルビューが表示されたときにMainViewController
を返すために- (UIStatusBarStyle)preferredStatusBarStyle {}
の条件で_[self setNeedsStatusBarAppearanceUpdate];
_メソッドのUIStatusBarStyleLightContent
で_prepareForSegue: sender:
_を呼び出そうとしましたが、それも効果はありません。
モーダルビューでUIStatusBarStyleを変更するにはどうすればよいですか?
編集:投稿の更新:ModalViewController
がNavigationController
にNavigationBar
。 NavigationBar
をhiddenに設定すると、ModalViewController
での_[self setNeedsStatusBarAppearanceUpdate];
_の呼び出しは正常に機能します。ただし、バーが表示されているときは違います。
適切なステータスバー情報を返すには、フルスクリーンで表示されているViewControllerが必要です。あなたの場合:ModalViewControllerを含むNavigationControllerは、preferredStatusBarStyle
を実装し、UIStatusBarStyleLightContent
を返す必要があります。
setNeedsStatusBarAppearanceUpdate
の呼び出しは、ViewControllerが返す値が実際に変更された場合にのみ必要です。ビューコントローラが最初に提示されたとき、とにかくそれらは照会されます。
フルスクリーン以外のmodalVC[〜#〜] can [〜#〜]はmodalPresentationCapturesStatusBarAppearance
を使用してstatusBarスタイルを制御できることに注意してください。
ステータスバーコントロールについてもっと知りたい人は、 ステータスバーを管理するUIViewController を無視しないでください。
2015-11-06に更新:
そして、 iOS Keys で説明されているUIViewControllerBasedStatusBarAppearance
を設定していることを確認してください
2018.04.09に更新:
NavControllerのviewControllerがiOS10.0-10.2でprefersStatusBarHidden
を呼び出さない可能性があることに気づきました。あなたのnavigationControllerをカスタマイズして
@implementation YourCustomNavController
//for iOS 10.0 - iOS 10.2
- (BOOL)prefersStatusBarHidden {
UIViewController *childVC = [self childViewControllerForStatusBarHidden];
if (childVC) {
return [childVC prefersStatusBarHidden];
}
return [super prefersStatusBarHidden];
}
@end
そして、もっと深く入りたい人は誰でもUIKitを掘り下げることができます+[UIViewController _currentStatusBarStyleViewController]
HopperまたはIDAProを使用します。それはあなたがこれらの種類のバグを解決するのを助けるかもしれません。
これを機能させるための鍵は、フルスクリーンのViewControllerだけがステータスバーのスタイルを決定できることです。
ナビゲーションコントローラーを使用していて、ビューコントローラーごとにステータスバーを制御する場合は、UINavigationControllerをサブクラス化し、topViewControllerの設定を返すようにpreferredStatusBarStyleを実装する必要があります。
ストーリーボードシーンのクラス参照をUINavigationControllerからサブクラスに変更してください(例:以下の例のMyNavigationController)。
(以下は私にとってはうまくいきます。アプリがTabBarベースの場合、UITabBarControllerをサブクラス化することで同様のことをしたいと思うでしょうが、私はそれを試していません)。
@interface MyNavigationController : UINavigationController
@end
@implementation MyNavigationController
- (UIStatusBarStyle)preferredStatusBarStyle
{
return self.topViewController.preferredStatusBarStyle;
}
@end
UINavigationControllerをサブクラス化せずにViewControllerを埋め込んだUINavigationControllerのステータスバーを変更するには、次を使用します。
navigationController?.navigationBar.barStyle = .Black // to make the status bar text white
.Blackはテキストを白(ステータスバーとビューのタイトル)にしますが、.Defaultは黒のタイトルとステータスバーを持ちます。
サイドメニュー/リビールコントローラー(SWRevealController)があり、ステータスバークエリのルートコントローラーであることがわかりました。 childViewControllerForStatusBarStyle
をオーバーライドすると、クエリを最前面のコントローラーに再ルーティングできます。
/**
This view is always considered the topmost for status bar color queries.
Pass the query along to what we're showing in front.
*/
- (UIViewController *)childViewControllerForStatusBarStyle
{
UIViewController *front = self.frontViewController;
if ([front isKindOfClass:[UINavigationController class]])
return ((UINavigationController*)front).topViewController;
else
return front;
}
これは私のために働きます:
View controller-based status bar appearance
をNO
に設定しますUIStatusBarStyleLightContent
に設定します(その値をコピーするだけです)[[UIApplication sharedApplication] setStatusBarStyle:UIStatusBarStyleLightContent];
を使用しますお役に立てば幸いです(参照: モーダルビューでios7ステータスバーが黒に戻りますか? )
アプリが最上位のviewControllerのstatusBarStyleから外れているようです。したがって、現在のviewControllerの上に別のviewControllerを追加すると、新しいviewControllerからキューを取得するようになります。
アプリのrootViewControllerが-(UIStatusBarStyle)preferredStatusBarStyleメソッドをオーバーライドする必要があるかどうかを調べるだけです
上記のすべての作業。ただし、ストーリーボードなどのすべてのインスタンスを変更するのは本当に苦痛な場合があります。したがって、サブクラス化も含む、私にとって有効なものがあります。
最初にサブクラスを作成します。
@interface HHNavLightColorBarController : UINavigationController
@end
@implementation HHNavLightColorBarController
- (UIStatusBarStyle)preferredStatusBarStyle {
return UIStatusBarStyleLightContent;
}
@end
次に、Objective-Cの魔法と<objc /runtime.h>を少し使用します。
ビューコントローラのリファレンスとそれを提示する場合:
UINavigationController *navVC = ...; // Init in your usual way
object_setClass(navVC, [HHNavLightColorBarController class]);
[self presentViewController:nav animated:YES completion:^{
NSLog(@"Launch Modal View Controller");
}];
時々それは少し邪魔にならないようです。あなたのkindOfClassがナビゲーションコントローラーであるかどうかをチェックするカテゴリーを作成し、それを自動的に行うこともできます。とにかく、答えはjaetzoldによるものです、私はこれが便利だと思っただけです。