wake-up-neo.com

Wie ändere ich UIStatusBarStyle in iOS 7 in modalen Ansichten mit Navigationsleiste?

Die iOS 7 Transition Guide geben einen guten Hinweis, wie man die UIStatusBarStyle dynamisch in einer UIViewController mit ändert

- (UIStatusBarStyle)preferredStatusBarStyle {
     return UIStatusBarStyleDefault;
}

zusammen mit [self setNeedsStatusBarAppearanceUpdate];

Dies funktioniert problemlos in einer Einzelansicht. Ich versuche jetzt jedoch, die UIStatusBarStyle in einer modalen Ansicht in UIStatusBarStyleLightContent zu ändern. Es gibt eine MainViewController, die zu der ModalViewController übergeht, die selbst in eine NavigationController eingebettet ist. Die ModalViewController hat ihren Stellvertreter auf die MainViewController gesetzt.

Ich habe versucht, [self setNeedsStatusBarAppearanceUpdate]; in der ModalViewController zusammen mit der folgenden Methode in dieser Klasse ohne Wirkung aufzurufen:

// In ModalViewController.m
- (UIStatusBarStyle)preferredStatusBarStyle {
     return UIStatusBarStyleLightContent;
}

Ich habe auch versucht, [self setNeedsStatusBarAppearanceUpdate]; in MainViewController on prepareForSegue: sender: mit Bedingungen in - (UIStatusBarStyle)preferredStatusBarStyle {} aufzurufen, um UIStatusBarStyleLightContent zurückzugeben, wenn die modale Ansicht angezeigt wird - aber das hat auch keine Auswirkungen.

Wie kann ich den UIStatusBarStyle in der modalen Ansicht ändern?

EDIT: Post updated: Ich muss erwähnen, dass die ModalViewController in eine NavigationController mit einer NavigationBar eingebettet ist. Wenn NavigationBar auf hidden gesetzt ist, funktioniert der Aufruf von [self setNeedsStatusBarAppearanceUpdate]; in ModalViewController einwandfrei. Aber nicht, wenn die Leiste sichtbar ist.

11
FrankZp

Sie benötigen einen ViewController, der im Vollbild angezeigt wird, um die entsprechenden Statusleisteninformationen anzuzeigen. In Ihrem Fall: Der NavigationController, der ModalViewController enthält, muss preferredStatusBarStyle implementieren und UIStatusBarStyleLightContent zurückgeben.

Ein Aufruf von setNeedsStatusBarAppearanceUpdate ist nur erforderlich, wenn die Werte, die ein View-Controller tatsächlich zurückgibt, sich ändern. Wenn der View Controller zum ersten Mal präsentiert wird, werden sie trotzdem abgefragt.

28
jaetzold

Es sollte beachtet werden, dass Nicht-Vollbild-ModalVC verwenden kann modalPresentationCapturesStatusBarAppearance, um den StatusBar-Stil zu steuern.

Wer mehr über die Statusleisten-Steuerung erfahren möchte, sollte das UIViewController, das die Statusleiste verwaltet nicht ignorieren.

Update am 06.11.2015:

Stellen Sie sicher, dass Sie UIViewControllerBasedStatusBarAppearance in iOS Keys eingestellt haben.

Update am 2018.04.09:

Mir ist aufgefallen, dass viewController in einem navController unter iOS 10.0 - 10.2 möglicherweise keinen Aufruf prefersStatusBarHidden erhält. Passen Sie Ihren navigationController an, um dies sicherzustellen

@implementation YourCustomNavController
//for iOS 10.0 - iOS 10.2
- (BOOL)prefersStatusBarHidden {
    UIViewController *childVC = [self childViewControllerForStatusBarHidden];
    if (childVC) {
        return [childVC prefersStatusBarHidden];
    }
    return [super prefersStatusBarHidden];
}
@end

Jeder, der tiefer in das Innere gehen möchte, kann mit Hopper oder IDA Pro in UIKit +[UIViewController _currentStatusBarStyleViewController] einsteigen. Es kann helfen, diese Art von Fehlern zu beheben.

24
Puttin

Der Schlüssel zu dieser Arbeit ist, dass nur der Vollbild-Ansichts-Controller den Stil der Statusleiste bestimmt.

Wenn Sie einen Navigationscontroller verwenden und die Statusleiste auf Pro-View-Controller-Basis steuern möchten, müssen Sie UINavigationController subclassieren und bevorzugterStatusBarStyle so implementieren, dass die Einstellung von topViewController zurückgegeben wird.

Stellen Sie sicher, dass Sie die Klassenreferenz in Ihrer Storyboard-Szene von UINavigationController in Ihre Unterklasse ändern (z. B. in MyNavigationController im folgenden Beispiel).

(Das Folgende funktioniert für mich. Wenn Ihre App TabBar-basiert ist, möchten Sie etwas ähnliches tun, indem Sie den UITabBarController subclassieren, aber ich habe das nicht ausprobiert).

@interface MyNavigationController : UINavigationController

@end

@implementation MyNavigationController

- (UIStatusBarStyle)preferredStatusBarStyle
{
    return self.topViewController.preferredStatusBarStyle;
}

@end
11
Juddster

Um die Statusleiste des UINavigationController zu ändern, der Ihren ViewController einbettet, ohne den UINavigationController zu unterteilen, verwenden Sie Folgendes:

navigationController?.navigationBar.barStyle = .Black // to make the status bar text white

Schwarz wird den Text weiß (Statusleiste und Titel der Ansicht), während .Default einen schwarzen Titel und eine Statusleiste hat.

6
Alex Wally

Ich hatte einen Side Menu/Reveal-Controller (SWRevealController), der sich immer als Root-Controller für Statusleistenabfragen erwies. Durch Überschreiben von childViewControllerForStatusBarStyle lasse ich die Abfrage an den vordersten Controller umleiten.

/**
 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;
}
2
Graham Perks

Das funktioniert für mich:

  1. Setze View controller-based status bar appearance auf NO
  2. Setzen Sie den Statusleistenstil auf UIStatusBarStyleLightContent (kopieren Sie einfach diesen Wert)
  3. In appDelegate verwenden Sie [[UIApplication sharedApplication] setStatusBarStyle:UIStatusBarStyleLightContent];

Hoffe, es hilft (ref: ios7-Statusleiste, die in modalen Ansichten wieder schwarz wird? )

1
samthui7

Es scheint, als ob die App den statusBarStyle des obersten viewControllers verliert. Wenn Sie also einen weiteren viewController über Ihren aktuellen Controller hinzufügen, erhält er nun die Hinweise vom neuen viewController.

1

Schauen Sie einfach nach, ob rootViewController Ihrer App überschrieben werden muss - (UIStatusBarStyle) - PreferredStatusBarStyle-Methode

0
devClown

Alle oben genannten Arbeiten. Manchmal finde ich es aber wirklich schwierig, jede Instanz im Storyboard usw. zu ändern. Also hier ist etwas, was für mich funktioniert und auch eine Unterklasse beinhaltet.

Erstellen Sie zuerst die Unterklasse:

@interface HHNavLightColorBarController : UINavigationController

@end

@implementation HHNavLightColorBarController

- (UIStatusBarStyle)preferredStatusBarStyle {
    return UIStatusBarStyleLightContent;
}
@end

Dann die Magie von Objective-C und ein wenig von <objc/runtime.h> verwenden

Wenn Sie eine Referenz des View-Controllers und Ihrer Präsentation haben:

UINavigationController *navVC = ...; // Init in your usual way
object_setClass(navVC, [HHNavLightColorBarController class]);
[self presentViewController:nav animated:YES completion:^{
    NSLog(@"Launch Modal View Controller");
}];

Manchmal wirkt es etwas weniger aufdringlich. Sie könnten wahrscheinlich sogar eine Kategorie erstellen, in der überprüft wird, ob Ihre kindOfClass ein Navigationscontroller ist, und dies automatisch für Sie erledigt. Wie dem auch sei, die Antwort von jaetzold ist oben, ich fand es einfach praktisch.

0
bainfu