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

Change UISplitViewController displayMode property when entering multitasking? (iOS 14)

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

我有一个 UISplitViewController,其参数设置如下:

preferredDisplayMode = .twoBesideSecondary
preferredSplitBehavior = .tile
setViewController(SidebarVC(), for: .primary)
setViewController(SuppVC(), for: .supplementary)
setViewController(SecondaryVC(), for: .secondary)

在横向模式下,所有 3 列都有足够的空间 (.primary, .supplementary, .secondary)。在纵向或多任务处理时,屏幕宽度变窄,我的第 3 列 (.secondary) 被压缩到非常窄的宽度。水平大小 class 保持正常,所以我不能用它来检测它。 (当水平大小 class 变得紧凑时,我的 UISplitViewController.compact 显示并且工作正常)。

我想在屏幕变窄时将 UISplitViewController.displayMode 属性 更改为 .twoDisplaceSecondary,但水平尺寸 class 保持正常(即纵向时,或者当另一个应用程序处于多任务处理时)。这将允许第 3 列被推离屏幕(移动)而不是被压扁。

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

我想我可以通过 viewWillTransitionToSize() 方法管理方向变化,但我无法找到委托或其他方法来检测应用程序何时变窄,但仍然有 .regular 水平大小 class,像联系人应用程序,似乎可以做到。

显示我所引用内容的屏幕截图:

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

viewWillTransitionToSize 有一个包含宽度的大小参数。通常你会检查宽度是否小于 1024。

我发现在视图转换时同时设置 .preferredDisplayMode.preferredSplitBehavior 很重要。只设置一个或另一个会导致很多奇怪的行为。

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

中称之为