【问题标题】:Change UISplitViewController displayMode property when entering multitasking? (iOS 14)进入多任务时更改 UISplitViewController displayMode 属性? (iOS 14)
【发布时间】:2020-10-25 05:16:28
【问题描述】:

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

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

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

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

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

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

我想我可以通过viewWillTransitionToSize() 方法管理方向更改,但我无法找到委托或其他方式来检测应用何时变窄,但仍然使用.regular 水平尺寸类,例如通讯录应用,似乎可以做到。

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

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

【问题讨论】:

    标签: ios swift ipad uisplitviewcontroller ios14


    【解决方案1】:

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

    【讨论】:

    • 感谢您的回复!我能够弄清楚,事实证明每次设置 preferredDisplayMode 和 preferredSplitBehavior 都很重要。感谢您的帮助!
    【解决方案2】:

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

    对于未来的读者,我认为适用于这种情况的方法是在屏幕足够宽时设置preferredDisplayMode = .twoBesideSecondarypreferredSplitBehavior = .tile,然后在屏幕窄时设置preferredDisplayMode = .oneBesideSecondarypreferredSplitBehavior = .displace。我使用了一个函数来检查 view.frame.size.width viewDidLoad 和 viewWillTransition(toSize:)

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2020-11-07
      • 1970-01-01
      • 2020-10-22
      • 1970-01-01
      • 1970-01-01
      • 2020-10-22
      • 2020-11-27
      • 1970-01-01
      相关资源
      最近更新 更多