为什么在 displayModeButtonItem 触发 splitViewController 折叠时不调用 viewWillTransitionToSize...?

Car*_*ter 6 button uisplitviewcontroller ios displaymode viewwilltransitiontosize

我有一个 UISplitViewController,它的辅助(详细)VC 是一个 UICollectionViewController。我希望集合的单元格根据集合视图的大小和方面的变化来调整大小。我通过覆盖 UIContentContainer 协议方法触发此调整大小:

// MARK: - UIContentContainer protocol methods

override
func viewWillTransitionToSize(size: CGSize, withTransitionCoordinator coordinator: UIViewControllerTransitionCoordinator)
{
    setFlowLayoutItemSizeForViewSize(size)
    collectionViewLayout.invalidateLayout()
}
Run Code Online (Sandbox Code Playgroud)

当设备旋转时,这就是我想要的方式调用和工作;但是当 splitViewController?.displayModeButtonItem() 提供的按钮被按下以显示或折叠主(主)视图控制器时,不会调用此方法。由于折叠必然会更改辅助(详细信息)视图的大小,因此我认为应该在触发时调用 viewWillTransitionToSize... 方法。

所以,两个问题:

1) 实际上是否应该在按下 displayModeButtonItem 时调用 viewWillTransitionToSize... 方法?如果是这样,我似乎发现了一个错误。

2)如果我看到的实际上是正确的行为,任何人都可以建议我的辅助(详细)控制器“知道”什么时候按下 displayModeButtonItem 或者它的大小何时因该按钮而改变被压?

谢谢!

卡尔

kad*_*dam 6

1) 不是错误;displayModeChange 未被处理为 sizeTransition

2)你的 UISplitviewController 很可能已经有一个 UISplitViewControllerDelegate 可以实现可选的:

splitViewController(_ svc: UISplitViewController,
      willChangeToDisplayMode displayMode: UISplitViewControllerDisplayMode)
Run Code Online (Sandbox Code Playgroud)

将根据 splitView 切换到的模式UISplitViewControllerDisplayModePrimaryHiddenUISplitViewControllerDisplayModeAllVisible根据其切换到的模式来调用的方法。

  • 谢谢你的回答!如果 viewWillTransitionToSize 也被调用,那真的很棒,因为 willChangeToDisplayMode 不提供任何关于辅助视图控制器的结果大小的信息(这可以根据显示模式为特定的 UI 设计推断或计算,但我会真的很喜欢有一个通用的方法)。 (2认同)