Ich habe eine UITabViewController
-> UINavigationController
-> UIViewController
und möchte die Statusleiste ein- und ausblenden. Beim Aufruf von setNeedsStatusBarAppearanceUpdate()
wird die Methode prefersStatusBarHidden
nicht aufgerufen.
func fadeOutStatusBar (notification: NSNotification) {
statusBarHidden = true
self.setNeedsStatusBarAppearanceUpdate()
}
func fadeInStatusBar (notification: NSNotification) {
statusBarHidden = false
self.setNeedsStatusBarAppearanceUpdate()
}
override func prefersStatusBarHidden() -> Bool {
return statusBarHidden
}
Herausgefunden. in der info.plist-Datei: Die Anzeige der Controller-Statusleiste sollte auf YES gesetzt werden
Zunächst muss View controller-based status bar appearance
in der .plist
-Datei aufYESgesetzt sein.
Für Objective-C:
- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions {
[application setStatusBarHidden:YES];
return YES;
}
Für Swift:
func application(application: UIApplication, didFinishLaunchingWithOptions launchOptions: [NSObject:AnyObject]?) -> Bool {
application.statusBarHidden = true
return true
}
.m
-Datei, implementieren Sie einfach:Für Objective-C:
- (BOOL)prefersStatusBarHidden {
return YES;
}
Für Swift:
override func prefersStatusBarHidden() -> Bool {
return true
}
Stellen Sie zunächst für Swift 3 sicher, dass View controller-based status bar appearance
in Ihrer YES
plist-Datei auf Info
gesetzt ist
Und fügen Sie dies einfach zu Ihrem View-Controller hinzu:
override var prefersStatusBarHidden: Bool {
get {
return true
}
}
Ich hoffe, das hilft den Menschen in der Zukunft.
Vielleicht keine Lösung für das OP-Problem, aber die Ursache für den Aufruf von prefersStatusBarHidden
ist möglicherweise, dass Sie in Ihrem App-Delegaten ein zweites Fenster verwendet haben, z wurde gezeigt - dann erhält dieses Fenster die Ereignisse, die zum Aufruf dieser Funktionen führen.
sie können eine Erweiterung von UINavigationController schreiben, die die Standardimplementierung überschreibt und den oberen ViewController zurückgibt.
extension UINavigationController {
override public func childViewControllerForStatusBarHidden() -> UIViewController{
return self.topViewController
}
}
Wenn wir den UINavigationController , unsere AppDelegate verschachtelten. Fenster. RootViewController Normalerweise erstellen wir den navigationController, wenn er zum ersten Mal in der Funktion navigationController childViewControllerForStatusBarHidden aufgerufen wird, da der Standardwert nil zurückgibt und dann navigationController prefersStatusBarHidden function selbst heißt viewController über die Funktion prefersStatusBarHidden wird nicht aufgerufen, daher wird es nicht funktionieren. Wir erstellen also einen eigenen, der von NavigationController in dieser Unterklasse ChildViewControllerForStatusBarHidden erbt funktion.
Für Swift 4.2 iOS 12
Angenommen, Sie haben eine ViewController
in UINavigationController
. Erstellen Sie Ihre eigene Unterklasse von UINavigationController
und schließen Sie sie ein:
override var preferredStatusBarStyle: UIStatusBarStyle {
return .lightContent
}
Stellen Sie sicher, dass info.plist
die View Controller
-basierte Einstellung der Statusleiste setzt
Wenn Sie andere window
nicht ausgeblendet haben, wird die Methode nicht aufgerufen. Verstecken Sie einfach ein anderes Fenster, es wird so funktionieren, wie Sie es wünschen