0

В моем приложении большинство представлений имеют основные отличия в дизайне интерфейса при использовании на небольшом устройстве (например, портфолио iPhone) и большом (например, iPad в полноэкранном режиме). Базовая архитектура остается неизменной, но каждый контроллер View должен отображать очень отличающийся набор элементов интерфейса.Как заменить контроллеры представлений на основе изменения класса размера в iOS 9?

Я могу реагировать на изменения размера в Interface Builder, путем установки и удаления элементов и ограничений автоматического компоновки в соответствии с классом размера, но это было бы чрезвычайно громоздким и хрупким.

В уе старых времен (~ 2014), совет от Apple было:

Если вы хотите представить одни и те же данные по-разному в зависимости от того является устройство в портретной ориентации или ландшафтном способ сделать это использует два отдельных контроллера. Один контроллер просмотра должен управлять отображением данных в первичной ориентации (обычно портрет), а другой управляет отображением данных в альтернативной ориентации.

Несмотря на появление Размер классов, это кажется мне еще лучшее решение для моей конкретной конструкции (не забывая брать классы размера и сплит-вид, слайд-в на счет.)

Вопрос 1: при чем в моем приложении следует определить изменения признаков?

Вопрос 2: (предположим, что я загрузил альтернативный контроллер представлений из раскадровки) в ответ на изменение признака, как лучше всего переходить/представлять альтернативный контроллер представления?

Я задаю тот же вопрос, заданный здесь: Adaptive swapping of View Controllers in response to Size Class Trait changes iOS 9

Потому что никто не ответил на первоначальный вопрос.

ответ

0

Если вы говорите о признаке изменяется во время выполнения, для вращения примера устройства и IPad многозадачности, вы можете использовать viewWillTransitionToSize (см this question для образца кода) и настроить иерархию вида (с анимацией, если вам нравится) в Этот метод. Просто используйте стандартные методы представления и представления контроллера для добавления/удаления представленных контроллеров или дочерних контроллеров и их представлений.

Если вы говорите об изменениях свойств во время запуска (iPad против iPhone), просто создайте другой контроллер раскадровки или корневого представления для этих двух устройств и установите его в своем делете приложения. Тем не менее, этот подход будет иметь недостаток, чтобы не предлагать iPad-подобный опыт для iPhones с увеличенным размером в ландшафте без дополнительной работы с вашей стороны.


Я хочу оспорить то, что вы сказали, хотя:

я мог реагировать на изменения размера в Interface Builder, с помощью установки и удаления элементов и Auto Layout Ограничения в соответствии с размерного класса, но это будет быть чрезвычайно громоздким и хрупким.

Xcode 6 и более поздних версий поддерживает «унифицированные сториборды» которой документы описывают следующим образом:

Раскадровка может добавлять или удалять виды и ограничения макета на основе класса размера, что контроллер представления отображается в ,Вместо того, чтобы поддерживать две отдельные (но похожие) раскадровки, вы можете создать единую раскадровку для классов с несколькими размерами. Сначала создайте раскадровку с общим интерфейсом, а затем настройте его для разных классов размеров, адаптируя интерфейс к сильным сторонам каждого форм-фактора.

Xcode 8 особенно упрощает проектирование этих высоко адаптивных видов. Вы можете переключиться в режим редактирования для определенного размера и даже просмотреть, как будет выглядеть контроллер просмотра на разных устройствах. Прежде чем продолжить свой текущий путь, я призываю вас вникать в улучшения Xcode 8, если вы еще этого не сделали, и посмотреть, можете ли вы сделать унифицированные раскадровки для вашего использования.

+0

Спасибо за ваш ответ Аарон. Я забыл упомянуть одно. Мой взгляд на iPad против одного и того же представления на iPhone не имеет общих элементов пользовательского интерфейса. Это совершенно другое мнение. – user3158704

+0

В этом случае это звучит так, как унифицированные раскадровки не будут работать. Но это также похоже, что это может быть запутанное приложение :) –