32

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

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

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

但是当我在 .xib 中使用自动布局时,它会显示一个错误,即自动布局在 iOS 6 之前的版本中。

我该如何解决这个问题?

4

6 回答 6

37

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

  1. 确保Hide during application launch仍处于选中状态,以支持以前的操作系统版本。
  2. 在 Info.plist 文件中,添加View controller-based status bar appearance并将其设置为NO.
  3. 您可能需要在构建之前“清理”(我做过),但是您的应用程序应该像以前一样工作:没有状态栏挂在您的视图上!
于 2013-08-30T21:24:08.777 回答
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;
}
于 2013-09-11T10:08:51.160 回答
9

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

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

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


嗯,我想通了。

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

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

或者

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

有趣的是,在根视图控制器中,这些值分别设置为 default和UIRectEdgeAll,但它不在导航栏和页脚下。NOYEStableView

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

必须与其他两个属性之一混合也很奇怪,edgesForExtendedLayout即使它显然对行为负责。

于 2013-08-29T01:35:25.690 回答
8

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

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

如果您正在编辑XIB 文件,请选择它并单击助手编辑器。您将能够在那里找到“手动、自动...”菜单。然后选择“预览”。

在此处输入图像描述

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

在此处输入图像描述

如果您正在处理情节提要,则基本相同。您选择一个视图控制器对象,然后单击助手编辑器模式,选择“预览”,然后选择“iOS7 及更高版本”... Bluh Bluh Bluh。

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

于 2013-09-12T15:03:54.707 回答
3

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

例如,您有一个视图,它的 Y = 0。在 iOS 6 中,它位于状态栏底部的旁边。在 iOS 7 中,它显示在状态栏上方。

您应该使用Xcode 5 打开您的 XIB 文件并启用助手编辑器。按着这些次序:

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

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

  3. 完成!

于 2013-09-12T09:51:29.760 回答
0

您只需要检查一次您的主 UIView 大小是否适用于 iOS 7.0 及更高版本和 iOS 6.0 及更低版本,您可能会明白。

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

于 2013-09-12T12:28:46.123 回答