在iOS8上,以横屏模式显示我的应用程序将隐藏状态栏,但在iOS7上,状态栏在两个方向上都会显示。

41

我希望iOS 8在两种方向下都能显示状态栏,但这在iOS 7中正常显示。

navigationController.isNavigationBarHidden返回NO。

为什么iOS 8会这样做?


1
iOS8中的新功能。可能只适用于测试版。尝试使用Setting.app,您会看到相同的行为。 - Larme
2
请查看http://imgur.com/a/JGT4a - Jageen
1
现在iOS 8是测试版。可以在正式发布即9月份修复,这与他们发布iOS 7时遇到的情况相同。 - Ganesh G
10个回答

60

试试这个

didRotateFromInterfaceOrientation中添加以下代码

[[UIApplication sharedApplication] setStatusBarHidden:NO withAnimation:UIStatusBarAnimationNone];

编辑
无需在所有视图控制器中编写代码
plist中将View controller-based status bar appearance设置为NO,并在根视图控制器的viewDidLoad中添加以下代码即可。

[[UIApplication sharedApplication] setStatusBarHidden:YES withAnimation:UIStatusBarAnimationNone];
[[UIApplication sharedApplication] setStatusBarHidden:NO withAnimation:UIStatusBarAnimationNone];

示例项目
https://www.dropbox.com/s/uumneidk4wom5md/demoStatusBar.zip?dl=0


感谢您的回复和演示项目。在我的情况下,我的根视图控制器一直在不断变化。因此,我将不得不在每个根视图控制器中编写代码。 - Harshit Gupta
1
尝试在第一个根视图控制器中编写代码,可能会有所帮助。 - Jageen
4
这似乎是最佳解决方案,只需做一个小改动,即使用 application:FinishLaunchingWithOptions: 来强制隐藏状态栏。 - Mustafa
1
它也能与Trait Collection Did Change一起工作吗?真的吗?使用iOS 9?;) 请确认一下... - Bartłomiej Semańczyk
2
自iOS 9起,它已被弃用。 - Bartłomiej Semańczyk
显示剩余2条评论

49

尝试以下方法在iOS 8中显示横屏模式下的状态栏:

- (BOOL)prefersStatusBarHidden {
    return NO;
}

Swift版本

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

Swift 3、Xcode 8、iOS 10、/* ViewController.swift */

override var prefersStatusBarHidden: Bool {
        return false
    }

对于Swift: override func prefersStatusBarHidden() -> Bool { return false; } - xevser
只有在您的plist文件中将“_View controller-based status bar appearance_”设置为YES时,它才能正常工作。 - Gienadij Mackiewicz

9
Jageen的解决方案可能是最好的,只需要进行一个小修改,即不要使用viewDidLoad,而是更好地使用application:didFinishLaunchingWithOptions:
基本上是一个两步过程:
1)在您的项目的Info.plist文件中将“基于视图控制器的状态栏外观”设置为NO。
2)在application:didFinishLaunchingWithOptions:中强制隐藏状态栏,使用以下代码:
[[UIApplication sharedApplication] setStatusBarHidden:YES withAnimation:UIStatusBarAnimationNone];
[[UIApplication sharedApplication] setStatusBarHidden:NO withAnimation:UIStatusBarAnimationNone];

完成了,看到了吗!

注意:使用上述setStatusBarHidden:withAnimation语句是很重要的,以强制隐藏状态栏。


3
注意:在application:didFinishLaunchingWithOptions:中,您不需要调用[UIApplication sharedApplication],因为有一个方法参数application。因此,只需调用[application setStatusBarHidden:...]即可。 - Aleksejs Mjaliks

6

iOS 8的一个特性是,在横屏模式下状态栏将会被隐藏,这不是一个问题。即使是苹果公司自己的应用程序也有相同的行为。


5
我遇到了同样的问题!通过将这个添加到viewDidLoad中来解决。
  [self setNeedsStatusBarAppearanceUpdate];

而这就是实现本身。
-(BOOL)prefersStatusBarHidden{
    return NO;
}

我们需要在每个视图控制器中编写这段代码,对吗? - Harshit Gupta

4
他们通过给我们更多的工作使我们保持有益的就业状态。
或者...
他们做出了其他改变,导致一些部分占用的空间比以前多。随着iOS 7和“顶部布局栏指南”等事物的出现,在向下滑动屏幕时轻松地使用状态栏以及重新利用状态栏空间等小提示,许多人预测状态栏可能正在逐渐被淘汰作为UI的标准部分之一。
还有很多关于新设备尺寸的热议,这是由于他们在iOS 8中所做的改变,试图使编写针对不同尺寸的代码更加容易。
这只是纯粹的推测,但我不认为横屏状态栏会在iOS 8中返回。

3

Swift 3

override func viewDidLoad() {
        super.viewDidLoad()
        UIApplication.shared.setStatusBarHidden(true, with: .none)
        UIApplication.shared.setStatusBarHidden(false, with: .none)
///
    }

Info.plist 文件中添加如下内容:

UIViewControllerBasedStatusBarAppearance 布尔值设为 NO


1

Swift 3 (截至2017年6月2日)

override func viewWillAppear(_ animated: Bool) {
    super.viewWillAppear()
    self.setNeedsStatusBarAppearanceUpdate()
}

override var prefersStatusBarHidden : Bool {
    return false
}

0
我们按照上述步骤进行修复,并确保启用了左右横屏。在“项目/目标/部署信息”下进行设置。

enter image description here


-2
我们通过强制用户看不到的方向更改来解决了这个问题。在第一个加载的视图控制器中添加以下内容:
- (void)viewWillAppear:(BOOL)animated
{
    NSNumber *orientationLeft = [NSNumber numberWithInt:UIInterfaceOrientationLandscapeLeft];
    NSNumber *orientationRight = [NSNumber numberWithInt:UIInterfaceOrientationLandscapeRight];
    [[UIDevice currentDevice] setValue:orientationLeft forKey:@"orientation"];
    [[UIDevice currentDevice] setValue:orientationRight forKey:@"orientation"];
}

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接