【问题标题】:IOS7 Status bar hide/show on select controllersIOS7状态栏隐藏/显示选择控制器
【发布时间】:2013-09-25 17:49:37
【问题描述】:

我想在某些控制器上显示和隐藏状态栏。可以这样做还是更多的是整体应用设置。

我看过很多关于 plist 更新的帖子/问题:

View controller-based status bar appearance - NO

如果这完成了,那么将给予什么控制?

我希望在应用程序的主屏幕上显示状态栏。但是例如在侧面(幻灯片)菜单上我不希望它显示,这可能吗?这可以在 IB 或代码中更改吗?

编辑—— 我正在使用https://github.com/edgecase/ECSlidingViewController 实现。

主控制器(显示第一页)应该显示状态栏,但左侧菜单控制器在滑动时不应该显示。

我认为问题在于它们都位于同一个根控制器(滑动视图控制器)中,因此很难完成。

理想情况下,如果主屏幕(主页)在滑动时可以带上状态栏,那将是最好的。

【问题讨论】:

标签: ios uiviewcontroller ios7 statusbar uistatusbar


【解决方案1】:

plist 设置"View controller-based status bar appearance" 仅控制是否应在 iOS 7 上应用基于每个控制器的设置。

如果您将此 plist 选项设置为 NO,您必须手动启用和禁用状态栏,例如(直到 iOS 6):

[[UIApplication sharedApplication] setStatusBarHidden:YES]

如果您将此 plist 选项设置为 YES,您可以将此方法添加到每个 viewController 中,以便为每个控制器独立设置 statusBar(如果您有 viewControllers 的智能子类系统,这尤其好)

- (BOOL)prefersStatusBarHidden {
    return YES;
}

编辑:

如果您选择使用新的基于 viewController 的状态栏外观,还有另外两种有趣的方法 -

使用以下命令强制更新状态栏:

[self setNeedsStatusBarAppearanceUpdate]

如果您有嵌套控制器(例如 TabBarController 子类中的 contentViewController,您的 TabBarController 子类可能会询问它是当前的 childViewController 并转发此设置。我认为在您的特定情况下可能有用:

- (UIViewController *)childViewControllerForStatusBarHidden {
     return _myChildViewController;
}
- (UIViewController *)childViewControllerForStatusBarStyle {
     return _myOtherViewController;
}

【讨论】:

  • 谢谢,我认为问题在于滑动视图控制器的使用。由于实现使用根视图控制器,然后将视图控制器加载到中间,并在左侧加载一个视图控制器。这意味着它们都由根视图控制器控制,因此将状态栏设置为显示/隐藏都发生在两者上。
  • 这显然是您使用的 ECSSlidingViewController 的问题。但是你知道,在 iOS7 上你不再需要任何第三方滑动视图控制器了吗?但是,如果实施正确,它应该通过将 info.plist 语句设置为 NO 并使用 -prefersStatusBarHidden 来工作。
  • 对,我们也支持IOS6,所以我们不能真正使用ios7的功能。我想这也不是我可以改变的东西或解决方法。由于确实有一个根视图控制器持有两个控制器,因此我无法替代。谢谢
  • 我没有看过 ECSSliding 代码,但到目前为止,我只看到了这种 nicetohave 设计功能的可怕解决方案。它违反了许多编程设计原则,在一个视图中有两个视图控制器只是为了有一个很好的交互过渡效果。如果它是我的应用程序,我会为 iOS 6 用户减少此功能(并使用普通的非交互式 UINavigationController leftToRight 转换),因为 iOS 7 有一个漂亮的新交互式转换,它完全符合您的要求:查看会话WWDC 视频中的 218 个“使用视图控制器的自定义转换”。
  • 是的,在代码中你可以通过官方推荐的版本检查来检查当前版本:if(floor(NSFoundationVersionNumber) > NSFoundationVersionNumber_iOS_6_1) { }
【解决方案2】:

在 iOS 7 及更高版本上,只需实现 -prefersStatusBarHidden,例如在应隐藏状态栏的 UIViewController 中:

- (BOOL)prefersStatusBarHidden {
    return YES;
}

默认为NO

【讨论】:

    【解决方案3】:

    Swift 3

    override var prefersStatusBarHidden: Bool {
        return true
    }
    

    【讨论】:

    • get {} 不需要,直接返回true即可!
    【解决方案4】:

    您还可以在动画块中显示/隐藏状态栏,方法是将动画代码放在描述是否应该显示或隐藏的变量的 didSet 属性中。当您为 statusBarHidden Bool 设置新值时,这会在您选择的持续时间内自动触发状态栏的动画更新。

    /// Swift 3 syntax: 
    
    var statusBarHidden: Bool = true {
        didSet {
            UIView.animate(withDuration: 0.5) { () -> Void in
                self.setNeedsStatusBarAppearanceUpdate()
            }
        }
    }
    
    override var prefersStatusBarHidden: Bool {
        return statusBarHidden
    }
    
    override func viewWillAppear(_ animated: Bool) {
        super.viewWillAppear(animated)        
        statusBarHidden = false // show statusBar, animated, by triggering didSet block
    }
    

    【讨论】:

    • 终于!这正是我想要的。谢谢!
    【解决方案5】:

    Mojo66answer 的 Swift 版本:

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

    【讨论】:

      猜你喜欢
      • 2013-11-12
      • 2013-08-06
      • 2015-09-17
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多