Почему 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)
}

Надеюсь, поможет!

Другие вопросы по тегам