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

137

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

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

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

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

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

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

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

Дункан С
источник
2
Также есть документ от Apple, который описывает совместимость с версиями <8
Alladinian

Ответы:

151

Изменения, внесенные в пользовательский интерфейс с классами размера в 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, а затем выполните другие оптимизации для разных классов размеров. по мере необходимости, и таким образом вам не нужно будет использовать какой-либо класс размера с компактной высотой и избежать проблем.

Jordan H
источник
Я могу подтвердить, что в Beta4 класс размера Compact / Compact не соблюдается в симуляторе или на устройстве iOS 7. Интересно, что некоторые классы размеров соблюдаются. Спасибо за тестирование.
remmah
Тестирование на Regular / Regular на устройстве, и оно НЕ отвечает на настройки класса размера, все, что я получаю, это Any / Any с Beta 7
hokiewalrus
@hokiewalrus Я только что проверил Xcode 6 beta 7 и получил те же результаты, которые я подробно описал в ответе. Изменение ширины поля в IB для Regular Regular действительно правильно отображается на iPad под управлением iOS 7.1.
Jordan H
3
@Joey, это не ошибка; это сделано намеренно. Compact-Compactне экспортируется для iOS 7; Compact-Regularявляется. Подробнее см. Мой ответ.
Дэйв Делонг,
2
Ответ должен быть принятым, приведенный выше вводит в заблуждение.
Dominic Lacaille
68

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

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

  • Для iPad ваша раскадровка компилируется как «Обычный-Обычный» и упаковывается как перо «~ ipad».

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

Дэйв Делонг
источник
Насколько я понимаю, ваш ответ заключается в том, что «Обычный-Обычный» должен работать в iPad iOS7. Но это не работает. Я тестировал в выпуске XCode6 GM. Пожалуйста, поправьте меня, если я неправильно истолковал ваш ответ.
Iducool
4
Кажется, что обычная-регулярная работа только над раскадровкой, а не xib
Борис Шарпантье
@BorisCharpentier Я сообщил об ошибке в том rdar: // 18737656 , который был закрыт как дубликат открытого # 18490866
Максим Павлов
@BorisCharpentier вы нашли какое-нибудь решение для xib?
saadnib
4
@BorisCharpentier, я только что обнаружил, что эта проблема была решена в XCode 6.1.1 :-)
saadnib
27

Примечание. Этот ответ относился к бета-версии 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устройстве.

Ремма
источник
Рой, спасибо за ответ. У меня еще не было времени проверить это на себе, и я ценю это. Ведущий на этом видео должен был быть яснее. Я думаю, он имел в виду, что файлы XIB / Storyboard могут быть прочитаны iOS 6 и 7, но без поддержки адаптивного пользовательского интерфейса. Это делает кодирование приложений, работающих на iOS <8, проблематичным.
Duncan C
На самом деле. Интересно, есть ли какая-либо официальная документация о том, как поддерживать новые классы размера и более старый подход ориентации / идиомы в той же раскадровке / XIB. Я обновлю ответ, если что-нибудь найду.
remmah
По моему опыту, Apple, кажется, думает, что старые версии ОС прекращают свое существование, как только они анонсируют новую версию. Фактически, команда инженеров, похоже, перестает обращать внимание на новую версию ОС, как только она выпущена, и начинает сосредотачивать все свои усилия на следующей основной версии. У меня НИКОГДА не было исправленных ошибок в текущем основном выпуске. Они
Duncan C
3
Это больше не относится к Xcode 6 beta 4. См. Только что добавленный мной ответ.
Jordan H
1
@Joey спасибо за внимание; Я отредактировал свой ответ, чтобы направить читателей к вашему ответу, а также к ответу Дейва.
remmah 03
12

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

~~~~~

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

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

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

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

~~~~~

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

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

радиовизуальный
источник
Замечательно, что теперь это задокументировано, спасибо за публикацию!
Jordan H
3

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

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

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

введите описание изображения здесь

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

введите описание изображения здесь

ша
источник
$ ^% $ ^% @ # ^ & @ #% & ^% ... и вот я с большим количеством файлов xib и развертываю их на iOS 7 и 8.
TheEye
В яблочко. Я объединял раскадровки iPhone и iPad в одну и подумал, что поможет разделение ячеек в их собственный файл XIB :). Буду признателен, если вы добавите +1 к моему ответу.
sha
1
Я наблюдаю такое же поведение.
bjtitus
2

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

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

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

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

Джонатан Крук
источник
1

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

Ясень R
источник
Никакой разницы в выходе.
Iducool
1

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

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

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

Том Мэйджор
источник