UISplitViewController:从 Compact 旋转到 Regular 时如何防止扩展

UISplitViewController: How to prevent expansion when rotating from Compact to Regular

补充问题有很多答案,即如何防止在从 RegularCompact 接口更改时过渡到 PrimaryOverLay,例如使用

func splitViewController(splitViewController: UISplitViewController, collapseSecondaryViewController secondaryViewController: UIViewController, ontoPrimaryViewController primaryViewController: UIViewController) -> Bool

在我的例子中,我有一个 iPhone 6+ 的细节视图以纵向显示。当我将设备旋转到水平(CompactRegular)时,我希望主视图保持隐藏状态。我试过在很多地方将 preferredDisplayMode 设置为 .PrimaryHidden,但没有明显的影响。谷歌搜索一无所获。

好吧,在我写完问题后,但在发布之前,我绊倒了一个possible solution,这是为了覆盖拆分视图控制器引用的特征集合。

我采纳了这个想法并决定继承 UISplitViewController,并覆盖 traitCollection 属性。成功了:

final class MySplitViewController: UISplitViewController {
  var didOnce = false
  override var traitCollection: UITraitCollection {
    let old = super.traitCollection
    let change = UITraitCollection(horizontalSizeClass: .Compact)
    let new = UITraitCollection(traitsFromCollections: [old, change])
    return new
  }

显然,这是针对一台设备进行的硬编码 - 稍后我将添加一些可用于控制实际返回内容的函数。

不要覆盖 traitCollection,而是在拆分控制器的父视图控制器中使用方法 setOverrideTraitCollection:forChildViewController:,就像 Apple 的示例 AAPLTraitOverrideViewController.m

如果您的拆分控制器没有父级,在 Storyboard 中创建父级非常容易。添加一个新的视图控制器,使其成为入口点,添加一个容器视图,删除默认的嵌入视图,而是向拆分控制器添加一个嵌入的 segue,并在 viewDidLoad 中设置覆盖 self.childViewControllers.firstObject