为什么 viewWillTransitionToSize... 在 displayModeButtonItem 触发 splitViewController 崩溃时不调用?

Why is viewWillTransitionToSize... not called when displayModeButtonItem triggers splitViewController collapse?

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

// MARK: - UIContentContainer protocol methods

override
func viewWillTransitionToSize(size: CGSize, withTransitionCoordinator coordinator: UIViewControllerTransitionCoordinator)
{
    setFlowLayoutItemSizeForViewSize(size)
    collectionViewLayout.invalidateLayout()
}

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

那么,两个问题:

1) 当按下 displayModeButtonItem 时,实际上是否应该调用 viewWillTransitionToSize... 方法?如果是这样,我好像发现了一个bug。

2) 如果我所看到的实际上是正确的行为,那么当按下 displayModeButtonItem 或其大小时,任何人都可以为我的辅助(详细)控制器建议一种方法 "know"由于按下该按钮而发生变化?

谢谢!

卡尔

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

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

splitViewController(_ svc: UISplitViewController,
      willChangeToDisplayMode displayMode: UISplitViewControllerDisplayMode)

将使用 UISplitViewControllerDisplayModePrimaryHiddenUISplitViewControllerDisplayModeAllVisible 调用的方法,具体取决于 splitView 切换到的模式。

我解决这个问题的方法是子类化 UISplitViewController 并重写 viewWillTransitionToSize(...),如下所示:

override func viewWillTransitionToSize(size: CGSize, withTransitionCoordinator coordinator: UIViewControllerTransitionCoordinator) {
    super.viewWillTransitionToSize(size, withTransitionCoordinator: coordinator)

    //Get the master controller
    guard let masterController = viewControllers[0] as? UIViewController else {
        return print("master controller not of type UINavigationController")
    }

    //Notify masterController that the view will transition
    masterController.viewWillTransitionToSize(size, withTransitionCoordinator: coordinator)
}

希望对您有所帮助!

为此有一个内置通知:

// Sometimes view controllers that are using showViewController:sender and showDetailViewController:sender: will need to know when the split view controller environment above it has changed. This notification will be posted when that happens (for example, when a split view controller is collapsing or expanding). The NSNotification's object will be the view controller that caused the change.
UIKIT_EXTERN NSNotificationName const UIViewControllerShowDetailTargetDidChangeNotification NS_AVAILABLE_IOS(8_0);

请参阅 Apple 的 AdaptivePhotos 示例了解如何使用它。