UITabViewController
-> UINavigationController
-> UIViewController
があり、statusBarを非表示および再表示したい。 setNeedsStatusBarAppearanceUpdate()
を呼び出すと、メソッドprefersStatusBarHidden
は呼び出されません。
func fadeOutStatusBar (notification: NSNotification) {
statusBarHidden = true
self.setNeedsStatusBarAppearanceUpdate()
}
func fadeInStatusBar (notification: NSNotification) {
statusBarHidden = false
self.setNeedsStatusBarAppearanceUpdate()
}
override func prefersStatusBarHidden() -> Bool {
return statusBarHidden
}
理解した。 info.plistファイル内:ビューコントローラーステータスバーの外観をYESに設定する必要があります
まず、View controller-based status bar appearance
の中に .plist
ファイルは[〜#〜] yes [〜#〜]に設定する必要があります。
Objective-Cの場合:
- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions {
[application setStatusBarHidden:YES];
return YES;
}
Swiftの場合:
func application(application: UIApplication, didFinishLaunchingWithOptions launchOptions: [NSObject:AnyObject]?) -> Bool {
application.statusBarHidden = true
return true
}
.m
ファイル、実装のみ:Objective-Cの場合:
- (BOOL)prefersStatusBarHidden {
return YES;
}
Swiftの場合:
override func prefersStatusBarHidden() -> Bool {
return true
}
OPの問題の解決策ではないかもしれませんが、prefersStatusBarHidden
が呼び出されない原因として考えられるのは、スプラッシュ画面を表示するなど、アプリのデリゲートで2番目のウィンドウを使用した場合です。スプラッシュが表示された後に非表示にします-そのウィンドウは、これらの関数の呼び出しにつながるイベントを取得します。
uINavigationControllerの拡張機能を作成して、デフォルトの実装をオーバーライドし、最上位のViewControllerを返すことができます。
extension UINavigationController {
override public func childViewControllerForStatusBarHidden() -> UIViewController{
return self.topViewController
}
}
INavigationControllerをネストすると、AppDelegate。Window。RootViewController通常、最初にnavigationControllerを呼び出すときにnavigationControllerを作成しますchildViewControllerForStatusBarHidden関数nilを返し、navigationController prefersStatusBarHidden関数自体と呼ばれるため、prefersStatusBarHidden関数を介してviewControllerに設定したステータスバーは呼び出されないため、機能しません。そのため、このサブクラスのChildViewControllerForStatusBarHidden関数からNavigationControllerを継承する独自のものを作成します。
Swift 4.2 iOS 12
ViewController
内にUINavigationController
が含まれていると仮定します。 UINavigationController
の独自のサブクラスを作成し、そこに含めます:
override var preferredStatusBarStyle: UIStatusBarStyle {
return .lightContent
}
確認してください info.plist
セットView Controller
ベースのステータスバーの設定
他のwindow
が非表示になっていない場合、メソッドは呼び出されません。他のウィンドウを非表示にするだけで、希望どおりに機能します