为什么 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)
将使用 UISplitViewControllerDisplayModePrimaryHidden
或 UISplitViewControllerDisplayModeAllVisible
调用的方法,具体取决于 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 示例了解如何使用它。
我有一个 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)
将使用 UISplitViewControllerDisplayModePrimaryHidden
或 UISplitViewControllerDisplayModeAllVisible
调用的方法,具体取决于 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 示例了解如何使用它。