1

Использую UISplitViewController. Я хотел показать пустую сцену с деталями выбора, когда пользователь поворачивает свой iPhone 6 Plus в портрет и больше не видит никаких деталей. (Все остальные устройства ведут себя предсказуемо. Только 6 Plus может изменить свой внешний вид.) Теперь я использую вместо него split view delegate, который включает в себя некоторые странные запросы, но дело не в этом.Реагировать на iPhone 6+ rotation - traitCollectionDidChange: вызывается дважды для контроллера nav

Я задавался вопросом, как узнать, изменился ли iPhone 6 в ландшафт.

Лучшая идея, с которой я столкнулся: реагировать на изменения окружающей среды. Контроллер главного представления остается компактным во все времена, только его родительский диспетчер навигации меняется с компактного на обычный и обратно. (И UIWindow тоже, конечно.)

При использовании контроллера Разделить, для подклассов UINavigationController в «Master», traitCollectionDidChange: будет вызываться дважды при использовании iPhone 6 Plus и вращающийся в ландшафт. Он вызывается один раз при вращении назад.

willTransitionToTraitCollection:withTransitionCoordinator: даже называется три раза и 1 раз, соответственно.

Я предполагаю, что это потому, что в ландшафте вы можете видеть два контроллера обзора рядом друг с другом. Для меня не имеет смысла, что UINavigationController получает вызовы для контроллеров суб-представлений.

С UITraitCollections не содержит информации о том, на какой монитор управления влияет, я не могу определить, насколько среда была изменена с регулярного до компактного горизонтального размера надежно. Одна из коллекций признаков сообщит о правильном новом значении, но я не могу различить их друг от друга.

Как вы решили это, теперь, когда обратные вызовы вызываются несколько раз с разными значениями?

+0

Вы когда-нибудь это выясняли? – Luke

+0

К сожалению, нет. Я могу придумать специальную теорию об этом, но это только на iPhone 6, а не на iPad. Может быть, это ошибка? Когда я прикоснусь к базе кода в конце этого года, я посмотрю с тогда новым SDK ¯ \\ _ (ツ) _/¯ – ctietze

ответ

3

Я знаю, что это старая тема, но я не мог найти решение для той же проблемы в сети, так что вот мои два цента.

UISplitViewController - это контроллер контейнера. Поэтому он считается «отображаемым», даже если на нем есть контроллеры представлений. В документации к яблоку говорится, что:

«Контроллеры просмотра направляют сообщение об изменении признаков на свои контроллеры дочерних представлений. Контроллеры представлений перенаправляют изменение признака на свой представленный контроллер представлений».

Следовательно, всякий раз, когда вы вводите изменение в классе размеров контроллера разделенного вида, он называет его делегатом и делегатами обоих своих детей.

Для получения дополнительной информации проверки: https://developer.apple.com/reference/uikit/uicontentcontainer/1621511-willtransitiontotraitcollection

Edit: Я просто заметил, что я не объяснить полностью, почему UISplitViewController вызывается трижды. Если параметр willTransitionToTraitCollection: withTransitionCoordinator: не реализован в представленных представлениях, он, вероятно, следует за соглашением, которое Apple устанавливает для него:

«Если вы переопределите этот метод в своих собственных объектах, всегда вызывайте super в какой-то момент вашей реализации, чтобы UIKit может перенаправлять изменения признаков на соответствующий контроллер представления и на любые дочерние контроллеры. "

Идея этого Я думаю, что при изменении в traitCollection контроллера детского вида вы можете изменить макет и/или число его братьев и сестер.Для этой цели любое изменение в дочерних контроллерах должно вызывать контейнер, чтобы он знал, что происходит и соответствующим образом настраивается. Однако он не может отслеживать, какое изменение накладывается на других, чтобы все регистрировались.

Моим решением было обработать изменение в контроллерах дочерних представлений (UINavigationControllers в моем случае) вместо splitViewController путем их подклассификации и добавления логики перехода.

+0

Это лучшая теория, о которой я слышал, но :) Итак, я соглашусь, пока что-то лучше приходит. (Да здравствует научный метод!) – ctietze

Смежные вопросы