Как адаптивные интерфейсы 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
Он отлично работает в симуляторе iOS8 для XIB и Storyboard, а в iOS7 только ячейки, определенные в Storyboard, получают обновленные ограничения на iPad:
Ответ 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 на основе классов размеров.
Был бы рад, если бы ошибался.