prefersStatusBarHidden 未调用

prefersStatusBarHidden not called

我有一个 UITabViewController -> UINavigationController -> UIViewController 并且想要隐藏和取消隐藏状态栏。当我调用 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

首先,.plist文件中的View controller-based status bar appearance必须设置为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
}

对于 swift 3,首先,确保 View controller-based status bar appearance 在您的 Info plist 文件

中设置为 YES

然后将其添加到您的视图控制器中:

override var prefersStatusBarHidden: Bool {
    get {
        return true
    }
}

我希望这对以后的人有所帮助。

也许不是 OP 问题的解决方案,但如果您在应用程序委托中使用了第二个 window,也可能是 prefersStatusBarHidden 未被调用的原因,例如用于显示启动画面,并且您在显示启动画面后没有隐藏它 - 然后 window 获取导致调用这些函数的事件。

当我们嵌套 UINavigationController 时,我们的 AppDelegate。 Window。 RootViewController 通常我们创建navigationController的时候首先会在navigationController中调用childViewControllerForStatusBarHidden函数,因为默认returns nil,然后调用navigationControllerprefersStatusBarHidden函数本身,所以我们在viewController中通过prefersStatusBarHidden函数设置的状态栏不会被调用,所以不会起作用。 所以我们要创建我们自己的继承自 NavigationController,在这个子类 ChildViewControllerForStatusBarHidden 函数中。

如果您使用 UINavigationController 作为 AppDelegate 中的 window.rootViewController,那么您可能需要扩展 UINavigationController 以调用其 topViewControllerprefersStatusBarHidden:

class YourNavigationController: UINavigationController {
    override var childForStatusBarHidden: UIViewController? {
        return topViewController
    }
}

对于Swift4.2iOS12

假设您有一个 ViewController 包含在 UINavigationController 中。创建您自己的 UINavigationController 子类并在其中包含:

override var preferredStatusBarStyle: UIStatusBarStyle {
    return .lightContent
}

确保info.plist设置View Controller基于状态栏的设置

如果您有其他 window 未隐藏,则不会调用该方法。隐藏其他window即可,如你所愿

属性 prefersStatusBarHidden 正在当前视图控制器的根视图控制器上调用。

这意味着,如果您的应用基于 UISplitViewController,您必须在自定义 UISplitViewController class.[=13= 中实施 属性 ]

您只需要隐藏导航控制器,statusBar 也会隐藏。

试试这个 viewDidLoad 例子

override func viewDidLoad() {
    super.viewDidLoad()
    navigationController?.setNavigationBarHidden(false, animated: false)
}