prefersStatusBarHidden未调用

时间:2015-11-05 09:59:35

标签: ios statusbar

我有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
}

10 个答案:

答案 0 :(得分:37)

首先,View controller-based status bar appearance文件中的.plist必须设置为

  • 如果您希望状态栏隐藏在整个应用中:

对于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
}

答案 1 :(得分:19)

想出来。在info.plist文件中:  视图控制器状态栏外观应设置为YES

答案 2 :(得分:14)

对于swift 3,首先请确保View controller-based status bar appearance plist文件中的YES设置为Info

screenshot

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

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

我希望这有助于将来的人们。

答案 3 :(得分:9)

也许不是OP问题的解决方案,但是如果您在应用代理中使用了第二个窗口,例如用于显示启动画面,那么prefersStatusBarHidden未被调用的原因也可能是什么?在显示启动后没有隐藏它 - 然后该窗口获取导致调用这些函数的事件。

答案 4 :(得分:1)

如果没有隐藏其他window,则不会调用该方法。只需隐藏其他窗口,它就会按照您的意愿工作

答案 5 :(得分:0)

当我们嵌套 UINavigationController 时, AppDelegate。窗口。 RootViewController 通常我们会在第一次调用navigationController childViewControllerForStatusBarHidden 函数时创建navigationController,因为默认值返回nil,然后将其称为navigationController prefersStatusBarHidden 函数本身,因此我们在其中设置状态栏通过 prefersStatusBarHidden 函数的viewController将不会被调用,因此它将无法工作。 因此,我们将在此子类 ChildViewControllerForStatusBarHidden 函数中创建一个继承自 NavigationController 的函数。

答案 6 :(得分:0)

您可以编写UINavigationController的扩展,以覆盖其默认实现并返回顶部的ViewController。

  extension UINavigationController {
    override public func childViewControllerForStatusBarHidden() -> UIViewController{
       return self.topViewController
    }
   }

答案 7 :(得分:0)

对于Swift 4.2 iOS 12

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

override var preferredStatusBarStyle: UIStatusBarStyle {
    return .lightContent
}

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

答案 8 :(得分:0)

在当前视图控制器的根视图控制器上正在调用

属性prefersStatusBarHidden

这意味着,例如,如果您的应用基于UISplitViewController,则必须在自定义UISplitViewController类中实现该属性。

答案 9 :(得分:0)

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

试试这个 viewDidLoad 示例

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