如何在iPhone 6或5s上支持横向拆分视图



在我的应用程序中,iPhone 6的横向空间浪费了很多,甚至在4英寸的屏幕上也浪费了更少的空间。我已经在使用iOS 8的UISplitViewController更改来支持iPhone 6 Plus的横向双窗格视图,但在一些较小的设备上也可以看到这两个窗格。

方便的是,苹果在2014年举办了一次WWDC会议,题为"使用UIKit构建自适应应用程序",其中包括如何做到这一点的详细信息。您可以在这里下载示例代码,但简而言之:他们将UISplitViewController放在UIViewController子类中。当子类认为宽度足够宽时,它使用setOverrideTraitCollection:forChildViewController:来强制分割视图上的[UITraitCollection traitCollectionWithHorizontalSizeClass:UIUserInterfaceSizeClassRegular]。当时,示例代码运行良好,在大多数设备上仍然如此。

然而,在尝试在我自己的应用程序中使用此代码后,我发现它在iPhone 6 Plus上失败得很厉害。如果您下载示例代码并进行两项更改,您可以自己看到这一点:

  • 添加一个故事板,添加一个空的视图控制器,并将其设置为"启动屏幕文件"。这对于在6 Plus上以本机分辨率运行应用程序是必要的
  • AAPLTraitOverrideViewController.m中,将第21行更改为size.width > 500.0,或任何大于414的行。这对于确保拆分视图在6 Plus上仅显示单个纵向视图是必要的

现在,您可以在模拟器中运行该应用程序。要查看问题,只需执行以下操作:

  • 将设备旋转到横向(命令向右箭头)
  • 立即将其旋转回纵向(命令向左箭头)

你已经看到有些地方不对了。所有表格单元格的右侧都应该有一个箭头,但它们没有。他们表现得好像仍处于分裂状态。如果你点击其中一行,情况会变得更糟——详细信息视图从底部向上滑动,导航栏也不见了。

我认为iOS 8中一定有一个错误导致了这个问题。但由于这段代码是在iPhone 6 Plus发布之前共享的,因此它似乎也可能只需要一些调整就可以与该设备兼容。到目前为止,我找到的唯一解决方案是将第21行更改为类似if (size.width > 500.0 && size.width < 736.0)的内容,但我不想使用下次苹果推出新屏幕尺寸时可能再次中断的代码。有更好的方法来处理这个问题吗?

似乎您总是希望使水平大小类成为正则类(UIUserInterfaceSizeClassRegular)。要执行此操作,请覆盖traitCollectionDidChange:。在这种方法中,如果垂直大小类是compact(这表明它可能是横向的),则覆盖特征集合,使水平大小类是规则的。

UITraitCollection *compactHeight = [UITraitCollection traitCollectionWithVerticalSizeClass:UIUserInterfaceSizeClassCompact];
if ([self.traitCollection containsTraitsInCollection:compactHeight]) {
    UITraitCollection *regularWidth = [UITraitCollection traitCollectionWithHorizontalSizeClass:UIUserInterfaceSizeClassRegular];
    self.forcedTraitCollection = [UITraitCollection traitCollectionWithTraitsFromCollections:@[self.traitCollection, regularWidth]];
    [self setOverrideTraitCollection:self.forcedTraitCollection forChildViewController:_viewController];
} else {
    [self setOverrideTraitCollection:nil forChildViewController:_viewController];
}

然而,如果您想要更具体的行为,则必须依赖画布大小来实现应用程序特定的行为。

最新更新