Как адаптивные интерфейсы Xcode 6 могут быть обратно совместимы с iOS 7 и iOS 6?

Я только что посмотрел видео WWDC № 216 "Создание адаптивного интерфейса с помощью UIKit".

Около 45:10 Тони Ричкарди говорит об изменениях в IB в Xcode 6, чтобы поддержать новые изменения.

Он говорит: "Вы можете развернуть эти документы в более ранних версиях iOS".

(где "Эти документы", вероятно, означают XIB и раскадровки, которые имеют конкретные настройки для разных классов размеров.)

Я не придумываю это. Иди посмотри видео WWDC.

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

Если это возможно, это было бы замечательно. Вы можете создавать приложения, которые будут работать на iOS 6, 7 и 8, и использовать новые возможности гибкой компоновки пользовательского интерфейса, которые Apple добавила в Xcode 6. Я сам создал адаптивную логику пользовательского интерфейса в коде, и это совсем немного работы.

8 ответов

Решение

Изменения, внесенные в пользовательский интерфейс с классами размеров в Интерфейсном Разработчике, корректно отображаются на устройствах iOS 7 и в Preview в Xcode. Например, я изменил некоторые ограничения Auto Layout и размеры шрифта для Regular height Regular width, и эти измененные ограничения видны в iPad Simulator под управлением iOS 7.0.

Все оптимизации классов размеров доступны для iOS 7, кроме классов размеров, имеющих компактную высоту. Это было подтверждено Apple и теперь прямо указано в документации:

Для приложений, поддерживающих версии iOS более ранние, чем iOS 8, большинство классов размеров имеют обратную совместимость.

Классы размеров обратно совместимы, когда:
- Приложение построено с использованием Xcode версии 6 или новее
- Цель развертывания приложения раньше, чем iOS 8
- Размер классов указан в раскадровке или Xib
- Значение компонента высоты не компактно

Поскольку iOS 7 не учитывает пару классов размеров, при использовании их вы столкнетесь с проблемами. Например: если у вас есть Компактное w Любое h определено, а затем Компактное w определено Компактное h, в iOS 7 он будет соответствовать Компактному w Любому h, но в iOS 8 он будет выглядеть как Компактный w Компактный h.

Итак, если вы хотите использовать эти два класса размеров и поддерживать совместимость с iOS 7, я бы сделал любую оптимизацию для iPhone в альбомной ориентации с любой w любой h или компактной w любой h, а затем выполнил бы другие ваши оптимизации для разных классов размеров. по мере необходимости, и таким образом вам не нужно будет использовать какой-либо класс размера с компактной высотой, и вы избежите проблем.

При развертывании вашего приложения на iOS 7 Xcode скомпилирует вашу раскадровку двумя различными способами:

  • Для iPhone ваша раскадровка компилируется как "Compact-Regular" (компактная ширина, обычная высота), и это упаковывается как ваша "~iphone" кончик.

  • Для iPad ваша раскадровка будет скомпилирована как "Regular-Regular" и упакована как ваш перо "~ipad".

Поэтому, если вы хотите развернуть как iOS 7, так и iOS 8, вы должны сосредоточить свой дизайн на классах размера Compact-Any и Regular-Any. Это даст вам лучший опыт с точки зрения соответствия пользовательского интерфейса для целей развертывания. Вы, конечно, можете изменить макет для других классов размера, но если эти изменения не будут применены к классам размера Compact-Regular или Regular-Regular, вы не увидите этих изменений в iOS 7.

Примечание. Этот ответ относится к бета-версии Xcode 6 и больше не относится к версии для доставки. См. Ответы Джои и Дэйва Делонга на этой странице для правильной информации.

(оригинальный ответ сохраняется ниже):


В то время как Storyboards/XIBs настроен на использование классов размера будет работать на iOS 7 ОС в настоящее время не уважает тех, size classes и, кажется, использует класс размера по умолчанию "Любой / Любой".

Я согласен, что конкретный слайд, на который вы ссылаетесь, обещает такую ​​совместимость, но в настоящее время это не так. (Xcode 6 beta 2),

Чтобы проверить, я создал проект (iOS 8 SDK, deployment target of 7.1) с одной кнопкой, которая находится в центре vertically and horizontally в классе размера Любой / Любой, но выровненный по верхнему левому углу в классе размера Компакт / Компакт (например, iPhone в альбомной ориентации). Помощник предварительного просмотра XCode показывает, что кнопка меняет свое положение в iOS 8, но нет iOS 7, Я подтвердил это поведение на iOS 7 устройство также.

Поскольку в некоторых ответах и ​​комментариях обсуждалась природа обратной совместимости, я подумал, что поделюсь выдержкой из документации Apple:

~~~~~

Развертывание приложения с классами размеров на предыдущих версиях iOS

Для приложений, поддерживающих версии iOS более ранние, чем iOS 8, большинство классов размеров имеют обратную совместимость.

Классы размеров обратно совместимы, когда:

  • Приложение построено с использованием Xcode версии 6 или новее
  • Цель развертывания приложения раньше, чем iOS 8
  • Классы размеров указаны в раскадровке или в Xib
  • Значение компонента высоты не компактно

~~~~~

Эта последняя точка нацелена на это обсуждение, где Apple подтверждает, что, пока "компактная высота" не используется, она должна поддерживать обратную совместимость.

Надеюсь, это поможет кому-то!

Решая аналогичную проблему, я нашел другой ответ, которого я еще не видел здесь. Похоже, классы размеров в XIB файлы не работают вообще. Если я создаю прототип ячейки в storyboard файл это работает в iOS7, как объяснено в других ответах, однако, когда та же ячейка прототипа перемещается в отдельную XIB классы размера файла игнорируются в iOS7.

Вот ссылка на пример проекта, демонстрирующий это поведение: https://dl.dropboxusercontent.com/u/6402890/testSizeClasses.zip

В ячейке прототипа у меня есть четыре ограничения с каждого края серого вида. Каждый из них настраивается одинаково: Любой / Любой - 10, Обычный / Обычный - 20

Он прекрасно работает в симуляторе iOS8 для XIB и раскадровки, а в iOS7 только ячейки, определенные в раскадровке, получают обновленные ограничения на iPad:

Если это сэкономит кому-либо время, я считаю, что способ, которым Xcode 6 обеспечивает квази-обратную совместимость для классов размеров, заключается в ~ipad а также ~iphone раскадровки с суффиксами и ничего более. Это имеет смысл, поскольку классы размеров являются более абстрактным способом определения ранее раскадровки для iPad и раскадровки для iPhone.

Следовательно:

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

  • Если ваша цель - использовать классы размеров для поддержки измененных макетов для разных моделей в пределах одного и того же семейства устройств, т.е. iPhone 5/6/6+ вкл. пейзаж, то вам не повезло. Для их использования потребуется минимальная цель развертывания iOS 8.

@lducool - в конструкторе интерфейса в инспекторе удостоверений измените "Builds For" на iOS7.1 и более поздние версии.

К сожалению, ответы от Дейва и Джои не работают для меня. Мне не разрешено комментировать в этой теме, поэтому, пожалуйста, прости меня, если это не то место.

Для этого я сформулировал конкретный вопрос: пример адаптивного пользовательского интерфейса с портретной ориентацией iPhone, обратно совместимого с iOS 7

Из того, что я узнал до сих пор, теперь я считаю, что, как и в моем примере, невозможно иметь 2 отдельных разных ограничения для одного элемента пользовательского интерфейса в портретном и альбомном режимах с iPhone iOS7 на основе классов размеров. Был бы рад, если я ошибаюсь, хотя.

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