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

Я просто смотрел видео WWDС# 216, "Создание адаптивного интерфейса пользователя с UIKit".

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

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

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

Я этого не делаю. Посмотрите видео WWDC.

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

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

Ответ 1

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

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

Для приложений, поддерживающих версии iOS раньше, чем iOS 8, большинство классов размера являются обратно совместимыми. Классы классов обратно совместимы, когда:
- Приложение построено с использованием Xcode версии 6 или более поздней версии
- Цель развертывания приложения выше, чем iOS 8
- классы размера указаны в раскадровке или xib
- Значение компонента высоты не компактно

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

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

Ответ 2

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

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

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

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

Ответ 3

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

(исходный ответ сохранен ниже):


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

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

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

Ответ 4

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

~~~~~

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

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

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

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

~~~~~

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

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

Ответ 5

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

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

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

enter image description here

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

enter image description here

Ответ 6

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

Таким образом:

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

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

Ответ 7

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

Ответ 8

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

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

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