【问题标题】:prefersStatusBarHidden not calledprefersStatusBarHidden 未调用
【发布时间】:2016-02-06 02:36:25
【问题描述】:

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

【问题讨论】:

  • 这在操作系统中已经讨论过很多次了。见this
  • 只有接受的答案与我的相反
  • @Md1079,那是因为你的问题不是很清楚 - 听起来你只是在问如何在一个视图中做到这一点,所以大多数人给你的解决方案只是调整一个视图,而 Nghia Luong 给出了可能有帮助的两种选择。
  • 您可能需要检查以下答案:stackoverflow.com/questions/50714171/…

标签: ios statusbar


【解决方案1】:

首先,.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
}
  • 如果你想让状态栏在Specify View Controller中消失,在.m文件中,只需实现:

对于 Objective-C:

- (BOOL)prefersStatusBarHidden {
    return YES;
}

对于 Swift:

override func prefersStatusBarHidden() -> Bool {
    return true
}

【讨论】:

  • 对于 Swift 3:application.setStatusBarHidden(true, with: .none) 和 override var prefersStatusBarHidden: Bool { return true }
  • 我忘记了plist,谢谢!
  • 您还需要将Status bar is initially hidden设置为YES
【解决方案2】:

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

【讨论】:

  • 如果您更详细地解释这将实现什么本地状态栏隐藏,您的回答会更有用?全球跨应用程序? (仅供参考,您的答案显示了如何在全球范围内执行此操作-而您最初的问题似乎是在询问如何为“视图”执行此操作)这令人困惑且不清楚。我认为你应该接受 Nghia 对这个问题的回答。
  • 是的,它让视图控制器处理状态栏。否则,永远不会调用委托。
【解决方案3】:

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

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

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

我希望这对未来的人们有所帮助。

【讨论】:

    【解决方案4】:

    也许不是解决 OP 问题的方法,但也可能是导致 prefersStatusBarHidden 未被调用的原因是您在应用程序委托中使用了第二个窗口,例如用于显示启动屏幕,而您没有在显示启动画面后将其隐藏 -​​ 然后该窗口会获取导致调用这些函数的事件。

    【讨论】:

    • 谢谢你。您是如何最终解决这种情况以显示状态栏的?
    • 我不记得了 - 但可能隐藏了我提到的窗口 :-)
    【解决方案5】:

    当我们嵌套 UINavigationController 时,我们的 应用代理。窗户。 RootViewController 通常我们创建navigationController的时候首先会调用navigationController的childViewControllerForStatusBarHidden函数,因为默认返回nil,然后调用navigationController的prefersStatusBarHidden函数本身,所以我们设置的状态栏viewController 通过 prefersStatusBarHidden 函数不会被调用,所以它不起作用。 因此,我们将在这个子类 ChildViewControllerForStatusBarHidden 函数中创建自己的继承自 NavigationController 的控制器。

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

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

    【讨论】:

    • 刚刚让我免于撞墙!谢谢!!
    【解决方案6】:

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

    【讨论】:

      【解决方案7】:

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

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

      【讨论】:

        【解决方案8】:

        适用于 Swift 4.2 iOS 12

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

        override var preferredStatusBarStyle: UIStatusBarStyle {
            return .lightContent
        }
        

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

        【讨论】:

          【解决方案9】:

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

          试试这个viewDidLoad 示例

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

          【讨论】:

            猜你喜欢
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 2016-06-10
            • 2018-12-09
            • 2014-06-30
            • 1970-01-01
            • 2020-05-01
            • 1970-01-01
            相关资源
            最近更新 更多