Почему viewWillTransitionToSize... не вызывается, когда displayModeButtonItem вызывает спад splitViewController?
У меня есть UISplitViewController, чей вторичный (подробно) VC является UICollectionViewController. Я хочу, чтобы размеры ячеек коллекции изменялись в зависимости от размера и вида представления коллекции. Я запускаю это изменение размера, переопределяя метод протокола UIContentContainer:
// MARK: - UIContentContainer protocol methods
override
func viewWillTransitionToSize(size: CGSize, withTransitionCoordinator coordinator: UIViewControllerTransitionCoordinator)
{
setFlowLayoutItemSizeForViewSize(size)
collectionViewLayout.invalidateLayout()
}
Это называется и работает так, как я хочу, когда устройство вращается; но этот метод не вызывается, когда кнопка, предоставленная splitViewController?.displayModeButtonItem(), нажата, чтобы показать или свернуть основной (главный) контроллер представления. Поскольку этот коллапс неизбежно меняет размер вторичного (подробного) представления, я хотел бы иметь в виду, что метод viewWillTransitionToSize... должен вызываться при его запуске.
Итак, два вопроса:
1) Должен ли метод viewWillTransitionToSize... быть фактически вызван при нажатии displayModeButtonItem? Если так, я, кажется, нашел ошибку.
2) Если то, что я вижу, на самом деле является правильным поведением, может кто-нибудь предложить способ для моего вторичного (подробного) контроллера "знать", либо когда нажата displayModeButtonItem, либо когда его размер изменяется в результате этой кнопки быть нажатым?
Спасибо!
деревенщина
3 ответа
1) не ошибка; displayModeChange не обрабатывается sizeTransition
2) Ваш UISplitviewController, скорее всего, уже имеет UISplitViewControllerDelegate, который может реализовывать необязательное:
splitViewController(_ svc: UISplitViewController,
willChangeToDisplayMode displayMode: UISplitViewControllerDisplayMode)
метод, который будет вызван с UISplitViewControllerDisplayModePrimaryHidden
или же UISplitViewControllerDisplayModeAllVisible
в зависимости от того, на какой режим переключается splitView.
Для этого есть встроенное уведомление:
// 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
и переопределяя 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)
}
Надеюсь, поможет!