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

6
在我的应用程序中,iPhone 6的横屏模式和4英寸屏幕上也存在大量空间浪费。我已经使用iOS 8的UISplitViewController更改来支持iPhone 6 Plus上的双窗格视图,但是在一些较小的设备上同时看到两个窗格也会很有用。
方便的是,苹果在WWDC 2014会议上介绍了"使用UIKit构建自适应应用程序",其中包括如何完成此操作的详细信息。您可以在此处下载示例代码,但简而言之:他们将UISplitViewController放入UIViewController子类中。当该子类认为宽度足够宽时,使用setOverrideTraitCollection:forChildViewController:强制在分割视图上使用[UITraitCollection traitCollectionWithHorizontalSizeClass:UIUserInterfaceSizeClassRegular]。当时示例代码效果很好,在大多数设备上仍然有效。
然而,在我尝试在自己的应用程序中使用此代码后,我发现它在iPhone 6 Plus上表现非常糟糕。如果您下载示例代码并进行两个更改,就可以看到这一点:
- 添加一个Storyboard,向其中添加一个空视图控制器,并将其设置为“启动屏幕文件”。这是在6 Plus上以其本机分辨率运行应用程序所必需的。 - 在AAPLTraitOverrideViewController.m中,将第21行更改为size.width > 500.0,或大于414的任何值。这是确保拆分视图在6 Plus上的纵向模式下仅显示单个视图所必需的。
现在,您可以在模拟器中运行该应用程序。要查看问题,请执行以下操作:
- 将设备旋转到横向(command-right arrow) - 立即将其旋转回纵向(command-left arrow)
您已经可以看到有些地方不对劲了。在纵向时,所有表格单元格都应该在右侧有箭头,但实际上没有。它们的行为就像仍处于拆分视图中。如果您点击其中一行,情况会变得更糟——详细视图从底部滑出,导航栏消失了。
我认为iOS 8存在错误,导致了这个问题。但由于在iPhone 6 Plus发布之前就共享了此代码,因此似乎有可能只需要进行一些调整,使其与该设备兼容。到目前为止,我找到的唯一解决方案是将第21行更改为类似于if (size.width > 500.0 && size.width < 736.0)的内容,但我不想使用可能会在下次苹果推出新屏幕尺寸时再次出现问题的代码。有更好的方法来处理这个问题吗?
1个回答

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];
}

但是,如果你需要更具体的行为,你就需要依靠应用程序特定的画布大小。


很好。我将您的高度检查更改为(self.view.bounds.size.width > 500.0),看起来它正在按照我的意愿工作。(我绝对不想在4S上使用分割视图,而5S可能有点勉强。)有趣的是,即使最终执行相同的特质集合覆盖,这似乎并没有展示出相同的错误。出于好奇,您为什么要将self.traitCollection和regularWidth结合在一起?只使用regularWidth进行覆盖似乎也可以达到同样的效果? - robotspacer
@Matt,iPhone 6也能启用这个功能吗? - Besi
1
@Besi 当然可以。同样的方法也可以奏效。只需将 iPhone 6 的 trait collection 覆盖为 regular,而非 compact 即可。 - Matt Zanchelli

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