Изменить свойство displayMode UISplitViewController при входе в многозадачность? (iOS 14)

Как я могу определить, когда многозадачность iPad (т. е. другое приложение, выведенное на экран рядом с моим приложением) становится активным?

У меня есть UISplitViewController со следующими настройками, как показано ниже:

preferredDisplayMode = .twoBesideSecondary
preferredSplitBehavior = .tile
setViewController(SidebarVC(), for: .primary)
setViewController(SuppVC(), for: .supplementary)
setViewController(SecondaryVC(), for: .secondary)

В альбомной ориентации достаточно места для всех 3 столбцов (.primary, .supplementary, .secondary). В портретной ориентации или при многозадачности ширина экрана меньше, а мой третий столбец (.secondary) сжимается до очень узкой ширины. Класс горизонтального размера остается обычным, поэтому я не могу использовать его для его обнаружения. (Когда класс горизонтального размера становится компактным, мой UISplitViewController.compact отображается и работает нормально).

Я хочу изменить свойство UISplitViewController.displayMode на .twoDisplaceSecondary, когда экран уже, но класс горизонтального размера остается обычным (т. е. в портретной ориентации или когда другое приложение работает в многозадачном режиме). Это позволит вытолкнуть 3-ю колонку за пределы экрана (сместить), а не раздавить.

Прекрасным примером точного поведения, которое я ищу, является приложение «Контакты» на iPad в iOS 14. Оно использует макет из трех столбцов, по-видимому, с displayMode .tile. Когда приложение развернуто в альбомной ориентации на весь экран, отображаются все 3 столбца, и остается достаточно места, чтобы не происходило сжатие. Однако, если вы переводите другое приложение в режим многозадачности (таким образом делая ширину приложения «Контакты» уже, но класс горизонтального размера остается обычным), displayMode, кажется, изменяется на .twoDisplaceSecondary, а 3-й столбец выталкивается за пределы экрана, а не сжимается.

Я думаю, что могу управлять изменениями ориентации с помощью метода viewWillTransitionToSize(), но мне не удалось найти делегата или другого способа определить, когда приложение уже, но все же с классом горизонтального размера .regular, таким как приложение «Контакты», по-видимому, в состоянии сделать.

Скриншоты, чтобы показать, на что я ссылаюсь: Приложение Приложение

Вы можете видеть, что на втором снимке экрана 3-й столбец смещается, а не сжимается, когда не хватает места.


person dank_muffin    schedule 04.07.2020    source источник


Ответы (2)


Я понял, что важно установить ОБА .preferredDisplayMode и .preferredSplitBehavior при переходе вида. Установка только одного или другого приведет к большому количеству странного поведения.

Для будущих читателей: я понял, что в этом случае работает установка preferredDisplayMode = .twoBesideSecondary и preferredSplitBehavior = .tile, когда экран достаточно широк, затем установка preferredDisplayMode = .oneBesideSecondary и preferredSplitBehavior = .displace, когда экран узкий. Я использовал функцию, которая проверяет, является ли view.frame.size.width ‹ 1194, чтобы определить, является ли экран полной шириной или нет, поскольку использование только ориентации может вызвать проблемы, если приложение находится рядом с другим. Я называю это в viewDidLoad, а также viewWillTransition(toSize:).

person dank_muffin    schedule 07.07.2020

viewWillTransitionToSize имеет параметр размера, содержащий ширину. Обычно вы проверяете ширину меньше 1024.

person malhal    schedule 07.07.2020
comment
Спасибо за ответ! Я смог понять это, оказывается, важно каждый раз устанавливать как PreferredDisplayMode, так и PreferredSplitBehavior. Спасибо за помощь! - person dank_muffin; 07.07.2020