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

rob*_*cer 6 cocoa-touch uikit uisplitviewcontroller

在我的应用程序有一个在景观浪费了不少空间,在iPhone 6,并在较小的程度上,甚至在4" 的画面.我已经使用的iOS 8的UISplitViewController更改,以支持横向两个窗格视图在iPhone 6加,但在一些较小的设备上看到两个窗格也很有用.

方便的是,Apple有一个WWDC 2014会议,"使用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)但我不想使用下次Apple引入新屏幕尺寸时可能再次破坏的代码.有没有更好的方法来处理这个?

小智 8

好像你总是希望将水平尺寸类设为常规(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];
}
Run Code Online (Sandbox Code Playgroud)

但是,如果您需要更具体的行为,则必须依赖画布大小来处理特定于应用的行为.