Как адаптивные интерфейсы 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 на основе классов размеров. Был бы рад, если я ошибаюсь, хотя.