我想在某些控制器上显示和隐藏状态栏。可以这样做,还是更多的整体应用程序设置。
我看过很多有关plist更新的帖子/问题:
View controller-based status bar appearance - NO
如果完成,那么会给出什么样的控制?
我希望在应用程序的主屏幕上显示状态栏。但是例如在侧面(幻灯片)菜单上我希望它不显示,这可能吗?可以在IB或代码中更改吗?
编辑 - 我正在使用https://github.com/edgecase/ECSlidingViewController实施。
主控制器(显示第一页)应显示状态栏,但左侧菜单控制器不应显示。
我认为问题在于它们都位于同一个根控制器(滑动视图控制器)内,因此很难完成。
理想情况下,如果主屏幕(主页面)在滑动时可以使用状态栏,那将是最好的。
答案 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)