代码之家  ›  专栏  ›  技术社区  ›  StuartM

IOS7选择控制器上的状态栏隐藏/显示

  •  44
  • StuartM  · 技术社区  · 11 年前

    我想在一些控制器上显示和隐藏状态栏。这可以做到吗?还是更像是一个整体的应用程序设置。

    我看到了许多关于plist更新的帖子/问题:

    View controller-based status bar appearance - NO
    

    如果完成了这项工作,那么会给出什么控制?

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

    编辑-- 我正在使用 https://github.com/edgecase/ECSlidingViewController 实施

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

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

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

    5 回复  |  直到 11 年前
        1
  •  128
  •   auco    11 年前

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

    如果您将此plist选项设置为NO,则必须手动启用和禁用状态栏,如(iOS 6之前的情况):

    [[UIApplication sharedApplication] setStatusBarHidden:YES]
    

    如果你将这个plist选项设置为YES,你可以将这个方法添加到每个viewControllers中,为每个控制器独立设置状态栏(如果你有一个viewController的智能子类系统,这特别好)

    - (BOOL)prefersStatusBarHidden {
        return YES;
    }
    

    编辑:

    如果您选择新的基于viewController的状态栏外观,还有两种方法值得关注-

    使用以下内容强制更新状态栏:

    [self setNeedsStatusBarAppearanceUpdate]
    

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

    - (UIViewController *)childViewControllerForStatusBarHidden {
         return _myChildViewController;
    }
    - (UIViewController *)childViewControllerForStatusBarStyle {
         return _myOtherViewController;
    }
    
        2
  •  14
  •   Mojo66    9 年前

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

    - (BOOL)prefersStatusBarHidden {
        return YES;
    }
    

    默认值为 NO .

        3
  •  14
  •   Natalia    7 年前

    雨燕3 :

    override var prefersStatusBarHidden: Bool {
        return true
    }
    
        4
  •  6
  •   Natalia    7 年前

    您也可以在动画块中显示/隐藏状态栏,方法是将动画代码放入变量的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
  •  2
  •   Community Egal    7 年前

    的Swift版本 Mojo66 answer :

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