状态栏显示在iOS 7中的视图边界上

时间:2013-08-22 09:02:11

标签: iphone ios6 ios7 xcode5

我尝试在iOS 7中测试我的应用程序,然后我发现我的视图显示在状态栏上...正如我读到的,在iOS 7中,状态栏被隐藏。那么如何让它兼容在iOS 6和iOS 7中运行?我是否必须为每个屏幕为不同的iOS版本制作不同的.xib文件?

我一直在阅读这篇文章: 如果标准应用程序的两个版本都应具有类似的布局,请使用“自动布局”创建在两个版本的iOS中均可正常运行的UI。要支持多个版本的iOS,请指定一组约束,Auto Layout可以使用这些约束来调整storyboard或XIB文件中的视图和控件(要了解有关约束的更多信息,请参阅“约束表达视图之间的关系”)。

如果标准应用的两个版本都应具有相似的布局,并且您没有使用自动布局,请使用偏移。要使用偏移,请首先更新iOS 7的UI。接下来,指定将早期UI中每个元素的原点,高度和宽度定义为iOS 7 UI中元素新位置偏移的值。

但是当我在.xib中使用autolayout时,它会显示一个错误,autolayout是iOS 6的先前版本。

如何解决此问题?

6 个答案:

答案 0 :(得分:37)

iOS 7显然支持某些视图隐藏的状态栏,但不支持其他视图。要为所有视图隐藏它,请执行以下操作:

  1. 确保仍然选中Hide during application launch,以支持以前的操作系统版本。
  2. 在Info.plist文件中,添加View controller-based status bar appearance并将其设置为NO
  3. 您可能需要"清洁"在构建之前,(我做过),但是你的应用程序应该像以前一样工作:没有状态栏悬挂在你的视图上!

答案 1 :(得分:24)

您可能需要在每个视图控制器上添加以下代码。

- (void)viewDidLoad
{
    [super viewDidLoad];
    if ([self respondsToSelector:@selector(setNeedsStatusBarAppearanceUpdate)])
    {
        [self prefersStatusBarHidden];
        [self performSelector:@selector(setNeedsStatusBarAppearanceUpdate)];
    }
    else
    {
        // iOS 6
        [[UIApplication sharedApplication] setStatusBarHidden:YES withAnimation:UIStatusBarAnimationSlide];
    }
}

// Add this method
- (BOOL)prefersStatusBarHidden {
    return YES;
}

答案 2 :(得分:9)

我有同样的问题。现在我做了两个黑客,并将决定我将去哪个:

  • 您可以通过将UIStatusBarHiddenUIViewControllerBasedStatusBarAppearance设置为true来完全隐藏状态栏。
  • 在我的应用中,我创建了一个值为0的Top Spacing约束,如果我检测到应用程序在iOS 7上运行,我会将其更改为20。

如何为状态栏区域创建Autolayout帐户?


好吧,我明白了。

在子视图中(在我的情况下为BRSMyListSubViewController),在viewDidLoad中,您需要设置这两个中的一个

self.edgesForExtendedLayout = UIRectEdgeNone;
self.automaticallyAdjustsScrollViewInsets = NO;

OR

self.edgesForExtendedLayout = UIRectEdgeNone;
self.extendedLayoutIncludesOpaqueBars = YES;

有趣的是,在根视图控制器中,这些值分别设置为默认UIRectEdgeAllNOYES,但其tableView不在导航栏和页脚下

我不知道为什么会这么不合逻辑。

同样奇怪的是edgesForExtendedLayout必须与其他两个属性中的一个混合,即使它明确地对行为负责。

答案 3 :(得分:8)

如果您想在iOS 7下使用Xcode 5显示状态栏,只需重新排列按钮和其他子视图,以在状态栏周围留出足够的空间。但是,等一下!我也喜欢支持iOS 6。我该怎么做?

我找到documentation from Apple,并在文档中找到了“支持两个版本的标准应用”标题。

如果您正在编辑XIB file,请选择它并单击助理编辑器。你可以在那里找到“手动,自动......”菜单。然后选择“预览”。

Enter image description here

然后你会找到一个并排的视图布局。然后你会注意到右窗格右侧底部有一个弹出按钮(视图);它说“iOS 7及更高版本”。您可以选择“iOS 6.1及更早版本”。 WOA!现在,您可以在不影响iOS 7布局的情况下对iOS 6.1进行调整。

Enter image description here

如果您正在处理故事板,它基本上是相同的。您选择一个视图控制器对象,然后单击助手编辑器模式,选择“预览”,然后选择“iOS7及更高版本”...... Bluh Bluh Bluh。

我不确定,但只有助理编辑才能切换到iOS 7 + / iOS 6-模式。我刚刚发现这个,所以请指出,如果有任何误解或其他伎俩。

答案 4 :(得分:3)

无需构建multi-xib。我认为你的问题是“20px”:同样的XIB文件在iOS 6中看起来很棒,但它在iOS 7中错过了20个像素。

例如,您有一个视图,它的Y = 0.在iOS 6中,它位于状态栏的底部。在iOS 7中,它出现在状态栏上。

您应该使用Xcode 5打开XIB文件并启用助理编辑器。请按照以下步骤操作:

  1. 选择文件检查器,并将“查看为”切换为“iOS 7及更高版本”

  2. 选择尺寸检查器,并使用“-20”

  3. 填充deltaY
  4. 已经完成了!

答案 5 :(得分:0)

您只需要检查一下iOS 7.0的主要UIView大小。后来& iOS 6.0&更低,可能你会有所了解。

从iOS 7 Apple改变主视图大小=固定这意味着如果你添加导航栏,tabbar你的视图大小保持不变[iPhone 4s:320 * 480,iPhone 5:320 * 568]。