Я только что посмотрел видео WWDC № 216 «Создание адаптивного пользовательского интерфейса с помощью UIKit».
Примерно в 45:10 Тони Риккарди рассказывает об изменениях в IB в Xcode 6 для поддержки новых изменений.
Он говорит: «Вы можете развернуть эти документы в обратном направлении в более старые версии iOS».
(где «Эти документы» предположительно означают XIB и раскадровки, которые имеют определенные настройки для разных классов размеров.)
Я не выдумываю. Посмотрите видео WWDC.
Как такое возможно? Коллекции признаков и классы размеров определены только в iOS 8. Как поведение среды выполнения, зависящее от новых для iOS 8 конструкций пользовательского интерфейса, может работать в предыдущих версиях iOS?
Если это возможно , было бы замечательно. Вы можете создавать приложения, которые будут работать на iOS 6, 7 и 8, и пользоваться преимуществами новых гибких возможностей макета пользовательского интерфейса, которые Apple добавила в Xcode 6. Я сам создал адаптивную логику пользовательского интерфейса в коде, и это довольно много. работы.
источник
Ответы:
Изменения, внесенные в пользовательский интерфейс с классами размера в Interface Builder, ДОЛЖНЫ отображаться правильно на устройствах iOS 7 и предварительном просмотре в 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 не уважает пару классов размеров, при их использовании вы столкнетесь с проблемами. Например: если у вас определено Compact w Any h, а затем определено Compact w Compact h, в iOS 7 будет соблюдаться Compact w Any h, но в iOS 8 он будет отображать внешний вид Compact w Compact h.
Итак, если вы хотите использовать эти два класса размеров и поддерживать совместимость с iOS 7, я бы сделал любую оптимизацию, которую вы хотите для iPhone в альбомной ориентации, в Any w Any h или Compact w Any h, а затем выполните другие оптимизации для разных классов размеров. по мере необходимости, и таким образом вам не нужно будет использовать какой-либо класс размера с компактной высотой и избежать проблем.
источник
Compact-Compact
не экспортируется для iOS 7;Compact-Regular
является. Подробнее см. Мой ответ.При развертывании вашего приложения на iOS 7 Xcode скомпилирует вашу раскадровку двумя разными способами:
Для iPhone ваша раскадровка компилируется как «Compact-Regular» (компактная ширина, обычная высота), и это упаковывается как перо «~ iphone».
Для iPad ваша раскадровка компилируется как «Обычный-Обычный» и упаковывается как перо «~ 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
в классе размера Any / Any, но выровнена по левому верхнему углу в классе размера Compact / Compact (например, iPhone в альбомной ориентации). Помощник предварительного просмотра Xcode показывает, что кнопка меняет свое положениеiOS 8
, но неiOS 7
. Я также подтвердил это поведение наiOS 7
устройстве.источник
Поскольку в некоторых ответах и комментариях обсуждалась природа обратной совместимости, я подумал, что поделюсь выдержкой прямо из документации Apple :
~~~~~
Развертывание приложения с классами размера в более ранних версиях iOS
Для приложений, поддерживающих версии iOS до iOS 8, большинство классов размеров имеют обратную совместимость.
Классы размеров обратно совместимы, когда:
~~~~~
Этот последний пункт предназначен для этого обсуждения, где 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 + inc. пейзаж, значит, вам не повезло . Для их использования потребуется минимальная цель развертывания iOS 8.
источник
@lducool - В построителе интерфейса в Инспекторе удостоверений измените "Builds For" на iOS7.1 и новее.
источник
К сожалению, ответы Дэйва и Джоуи мне не подходят. Мне не разрешено комментировать эту тему, поэтому, пожалуйста, простите меня, если это неправильное место.
Я сформулировал для этого конкретный вопрос: Пример для iPhone с портретно-альбомным адаптивным пользовательским интерфейсом, который обратно совместим с iOS 7.
Из того, что я узнал до сих пор, я считаю, что теперь, как и в моем примере, невозможно иметь 2 отдельных, разных ограничения для одного элемента пользовательского интерфейса в портретном и ландшафтном режиме с iPhone iOS7 на основе классов размеров. Хотя был бы рад, если ошибаюсь.
источник