进入多任务时更改 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 = .twoBesideSecondary
和 preferredSplitBehavior = .tile
,然后设置 preferredDisplayMode = .oneBesideSecondary
和 preferredSplitBehavior = .displace
当屏幕很窄时。我使用了一个函数来检查 view.frame.size.width < 1194 以确定屏幕是否全宽,因为如果应用程序与另一个应用程序并排使用方向只会导致问题。我在 viewDidLoad
和 viewWillTransition(toSize:)
.
中称之为
如何检测 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 = .twoBesideSecondary
和 preferredSplitBehavior = .tile
,然后设置 preferredDisplayMode = .oneBesideSecondary
和 preferredSplitBehavior = .displace
当屏幕很窄时。我使用了一个函数来检查 view.frame.size.width < 1194 以确定屏幕是否全宽,因为如果应用程序与另一个应用程序并排使用方向只会导致问题。我在 viewDidLoad
和 viewWillTransition(toSize:)
.