进入多任务处理时更改 UISplitViewController displayMode 属性?(iOS 14)

dan*_*fin 5 ipad uisplitviewcontroller ios swift ios14

如何检测 iPad 多任务处理(即另一个应用程序显示在屏幕上,与我的应用程序并排放置)何时处于活动状态?

我有UISplitViewController以下参数设置如下:

preferredDisplayMode = .twoBesideSecondary
preferredSplitBehavior = .tile
setViewController(SidebarVC(), for: .primary)
setViewController(SuppVC(), for: .supplementary)
setViewController(SecondaryVC(), for: .secondary)
Run Code Online (Sandbox Code Playgroud)

在横向模式下,所有 3 列 ( .primary, .supplementary, .secondary)都有足够的空间。在纵向或多任务处理时,屏幕宽度更窄,我的第 3 列 ( .secondary) 变得非常窄。水平尺寸类保持规则,所以我不能用它来检测它。(当水平尺寸类变得紧凑时,我的UISplitViewController.compact显示和工作都很好)。

我想将UISplitViewController.displayMode属性更改为.twoDisplaceSecondary屏幕较窄时,但水平尺寸类保持规则(即在纵向时,或当另一个应用程序处于多任务处理时)。这将允许将第 3 列推到屏幕外(移位)而不是压扁。

我正在寻找的确切行为的一个完美示例是 iOS 14 中 iPad 上的联系人应用程序。它使用三列布局,似乎显示模式为.tile。当应用横向全屏时,所有 3 列都会显示,并且有足够的空间不会发生挤压。但是,如果您将另一个应用程序带入多任务处理(从而使联系人应用程序宽度变窄,但水平尺寸类保持正常),则 displayMode 似乎更改为.twoDisplaceSecondary,并且第三列被推离屏幕而不是被压扁。

我想我可以通过viewWillTransitionToSize()方法管理方向更改,但我一直无法找到委托或其他方式来检测应用程序何时变窄,但仍然具有.regular水平尺寸类,如联系人应用程序,似乎能够做到.

显示我所引用内容的屏幕截图: 带有三列,全屏宽度的联系人应用程序 多任务处理中的联系人应用程序,第 3 列,已移位

您可以在第二个屏幕截图中看到,当空间不足时,第 3 列被置换而不是被压扁。

dan*_*fin 5

我发现设置两者.preferredDisplayMode以及.preferredSplitBehavior视图何时转换都很重要。仅设置其中之一会导致许多奇怪的行为。

对于未来的读者,我发现对于这种情况有效的是设置preferredDisplayMode = .twoBesideSecondarypreferredSplitBehavior = .tile当屏幕足够宽时,然后设置preferredDisplayMode = .oneBesideSecondarypreferredSplitBehavior = .displace当屏幕很窄时。我使用了一个函数来检查 view.frame.size.width < 1194 来确定屏幕是否为全宽,因为如果应用程序与另一个应用程序并排,仅使用方向会导致问题。我把这个称为viewDidLoad以及viewWillTransition(toSize:)