Як Xcode 6 адаптивний інтерфейс користувача може бути сумісним назад з iOS 7 та iOS 6?


137

Я щойно переглянув відеозапис WWDC №216 «Створення адаптивного інтерфейсу з UIKit».

Близько 45:10 Тоні Рікчарді розповідає про зміни ІБ в Xcode 6, щоб підтримати нові зміни.

Він каже: "Ви можете розгорнути ці документи назад до старих версій iOS".

(де "Ці документи", ймовірно, означають XIB та дошки, які мають специфічні параметри для різних класів розміру.)

Я це не вигадую. Подивіться відео WWDC.

Як це можливо? Колекції ознак і класи розмірів визначаються лише в iOS 8. Як поведінка часу виконання, що залежить від конструкцій інтерфейсу, які є новими для iOS 8, працює у попередніх версіях iOS?

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


2
Є також документ від Apple, який описує сумісність з версіями <8
Алладіан

Відповіді:


151

Зміни, внесені до інтерфейсу інтерфейсу за допомогою класів розмірів у Interface Builder DO, відображаються правильно на пристроях iOS 7 та Попередній перегляд у Xcode. Наприклад, я змінив деякі обмеження автоматичного макета та розміри шрифтів для регулярної висоти Регулярна ширина та ці змінені обмеження видно в 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 в ландшафтному режимі в будь-якому w Any h або Compact w Any h, а потім виконайте ваші інші оптимізації для різних класів розмірів у міру необхідності, і таким чином вам не потрібно буде використовувати жоден клас розмірів з компактною висотою і уникнете проблем.


Я можу підтвердити, що в Beta4 клас симпатій / компактності не дотримується ні в тренажері, ні на пристрої iOS 7. Цікаво, що деякі класи розмірів дотримуються. Дякуємо за тестування
remmah

Тестування на регулярне / регулярне на пристрої, і воно НЕ реагує на налаштування класу розмірів, все, що я отримую - будь-яке / будь-яке з Beta 7
hokiewalrus

@hokiewalrus Я щойно перевірив Xcode 6 beta 7 і отримаю такі самі результати, які я детально описав у відповіді. Зміна ширини поля в IB для Regular Regular відображається правильно на iPad під керуванням iOS 7.1.
Йорданія H

3
@Joey це не помилка; це навмисно. Compact-Compactне експортується для iOS 7; Compact-Regularє. Дивіться мою відповідь для отримання більш детальної інформації.
Дейв ДеЛонг

2
Якщо має бути прийнята відповідь, відповідь, наведена вище, є хибною.
Домінік Лакей

68

Розгортаючи ваш додаток на iOS 7, Xcode буде складати вашу таблицю розповідей двома різними способами:

  • Для iPhone ваша дошка розгортається як "Компактна-регулярна" (Компактна ширина, регулярна висота), і вона упаковується як ваша ручка "~ 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, проблематично.
Дункан C

Справді. Цікаво, чи є офіційна документація щодо підтримки нових класів розмірів та підходу, орієнтованого на ідентичніші та старші підходи в тій же Storyboard / XIB. Я оновлю відповідь, якщо знайду щось.
remmah

На мій досвід, схоже, Apple вважає, що старіші версії ОС припиняють своє існування, як тільки оголошують про нову версію. Насправді, інженерна команда, схоже, перестає звертати увагу на нову версію ОС, як тільки вона вийде, і почне зосереджувати всю свою енергію на наступній великій версії. У мене НІКОЛИ не було помилки, яку я виправив у поточному головному випуску. Вони
Данкан C

3
Це більше не виявляється у випадку з Xcode 6 beta 4. Дивіться відповідь, яку я щойно додав.
Йорданія H

1
@Joey дякую за голову вгору; Я відредагував свою відповідь, щоб направити читачів на вашу відповідь, а також на Дейва.
remmah

12

Оскільки у деяких відповідях та коментарях обговорювався характер зворотної сумісності, я думав, що поділюсь уривком прямо з Документації Apple :

~~~~~

Розгортання програми з класами розмірів на попередніх версіях iOS

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

Класи розмірів зворотно сумісні, коли:

  • Додаток створено за допомогою Xcode версії 6 або новішої версії
  • Ціль розгортання програми раніше, ніж iOS 8
  • Класи розмірів вказані в дошці розповідей або в xib
  • Значення висотного компонента не є компактним

~~~~~

Остання точка кулі орієнтована на це обговорення, де Apple підтверджує, що доки не використовується "компактна висота" , вона повинна підтримувати сумісність ззаду.

Сподіваюся, це допоможе комусь!


Чудово, що це зараз задокументовано, дякую за публікацію!
Йордан Н

3

Розглядаючи подібне питання, я знайшов ще одну відповідь, яку я ще не бачив тут. Схоже, класи розмірів у XIBфайлах взагалі не працюють. Якщо я створюю прототип комірки у storyboardфайлі, він працює в iOS7, як пояснено в інших відповідях, однак, коли ця сама комірка прототипу переміщується в окремі XIBкласи розмірів файлів, в iOS7 ігнорується.

Ось посилання на зразок проекту, що демонструє таку поведінку: https://dl.dropboxusercontent.com/u/6402890/testSizeClasses.zip

У комірці прототипу у мене є чотири обмеження з кожного краю сірого виду. Кожен з налаштованих однаково: Any / Any - 10, Regular / Regular - 20

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

Він добре працює в симуляторі iOS8 як для XIB, так і для аркушів аркушів, а в клітинках iOS7, визначених лише на Storyboard, оновлюються обмеження на iPad:

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


$ ^% $ ^% @ # ^ & @ #% & ^% ... і ось я з великою кількістю файлів xib та розгортанням на iOS 7 та 8.
TheEye

Саме так. Я поєднував розповіді iPhone та iPad в одне ціле і думав, що відокремлення комірок у власному XIB-файлі допоможе :). Буду вдячний, якщо ви можете поставити +1 моїй відповіді.
ша

1
Я бачу таку саму поведінку.
bjtitus

2

Якщо це економить кому-небудь час, я вважаю, що спосіб Xcode 6 забезпечує суцільну зворотну сумісність для класів розмірів - це через історичні ~ipadта ~iphoneсуфіксивні розклади, і не більше того. Це має сенс, оскільки класи розмірів - це більш абстрагований спосіб того, як ми раніше визначили iPad табло та iPod.

Тому:

  • Якщо ваша мета - використовувати класи розмірів для підтримки макетів для сімейства пристроїв (iPad проти iPhone), то вам пощастить: класи розмірів - це приємніший інтерфейс до раніше підтримуваного методу.

  • Якщо ваша мета - використовувати класи розмірів для підтримки змінених макетів для різних моделей в межах однієї сімейства пристроїв - тобто. iPhone 5/6/6 + вкл. пейзаж, то вам не пощастило . Для їх використання потрібна мінімальна ціль розгортання iOS 8.


1

@lducool - У програмі інтерфейсів в інспекторі ідентичності змініть "Builds For" на iOS7.1 і пізніших версій.


Немає різниці у виході.
Iducool

1

На жаль, відповіді від Дейва та Джоуї не працюють для мене. Мені не дозволено коментувати цю тему, тому, будь ласка, пробачте мене, якщо це неправильне місце.

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

З того, що я дізнався до цього часу, я вважаю, що, як і в моєму прикладі, неможливо мати два окремих, різних обмеження для одного елемента інтерфейсу в портретному та ландшафтному режимі з iPhone iOS7 на основі класів розмірів. Буду радий, якщо я помиляюся.

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.