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

时间:2013-09-20 10:58:18

标签: ios uiviewcontroller ios7 statusbar uistatusbar

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

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

View controller-based status bar appearance - NO

如果完成,那么会给出什么样的控制?

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

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

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

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

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

5 个答案:

答案 0 :(得分:128)

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

如果将此plist选项设置为NO,则必须手动启用和禁用状态栏(就像iOS 6一样):

[[UIApplication sharedApplication] setStatusBarHidden:YES]

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

- (BOOL)prefersStatusBarHidden {
    return YES;
}

修改

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

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

[self setNeedsStatusBarAppearanceUpdate]

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

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

答案 1 :(得分:14)

在iOS 7及更高版本中,只需实施public class MatrixEx {//implements Matrix { public static void print(int[][] input1, int[][] input2) { System.out.println("------------------ ------------------"); for (int row = 0; row < input1.length; row++) { for (int col = 0; col < input1.length; col++) { System.out.format("%4d", input1[row][col]); } System.out.print(" "); for (int col = 0; col < input2.length; col++) { System.out.format("%4d", input2[row][col]); } System.out.println(); } System.out.println("------------------ ------------------"); } public static void main(String[] args) { int[][] input1 = { {7, 2, 1}, {0, 3, -1}, {-3, 4, -2} }; int[][] input2 = { {-2, 8, -5}, {3, -11, 7}, {9, -34, 21} }; System.out.format("%12s%4s%12s\n", "input1", " ", "input2"); print(input1, input2); MatrixEx matrixFunc = new MatrixEx(); print(input1, matrixFunc.rowSwitching(input1, 1, 2)); } public int[][] rowSwitching(int[][] matrix, int row1, int row2) { System.out.format("%12s%4s%12s\n", "Before", " ", "After"); int[] temp1 = new int[matrix.length]; int[] temp2 = new int[matrix.length]; int[][] result = matrix; row1 -= 1; row2 -= 1; for (int i = 0; i < temp1.length; i++) { temp1[i] = result[row1][i]; } for (int i = 0; i < temp2.length; i++) { temp2[i] = result[row2][i]; } for (int i = 0; i < result.length; i++) { result[row1][i] = temp2[i]; } for (int i = 0; i < result.length; i++) { result[row2][i] = temp1[i]; } return result; } ,例如应隐藏状态栏的-prefersStatusBarHidden

UIViewController

默认值为- (BOOL)prefersStatusBarHidden { return YES; }

答案 2 :(得分:13)

Swift 3

override var prefersStatusBarHidden: Bool {
    return true
}

答案 3 :(得分: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
}

答案 4 :(得分:2)

Mojo66answer的快速版本:

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