6

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

// MARK: - UIContentContainer protocol methods

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

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

所以,两个问题:

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

2)如果我所看到的实际上是正确的行为,任何人都可以建议一种方法让我的辅助(详细)控制器“知道”何时按下 displayModeButtonItem,或者当它的大小因该按钮而发生变化时被压?

谢谢!

卡尔

4

3 回答 3

6

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

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

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

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

于 2015-10-16T16:18:23.427 回答
0

我解决这个问题的方法是子类化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)
}

希望能帮助到你!

于 2016-07-27T15:13:03.707 回答
0

为此有一个内置通知:

// 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示例以了解如何使用它。

于 2018-11-06T21:14:13.623 回答