Интерфейс Builder: что такое UIView Layout iOS 6/7 Deltas?

Я только что заметил свойство Delta iOS 6/7, найденное в макете структуры UIView.

Для чего это и почему это отсутствует в AutoLayout?

enter image description here

Ответ 1

Это фактически относится к Delta между расположением макета от iOS6 до iOS7.

В iOS7 некоторые виды могут скрывать строку состояния или иметь ее прозрачную и, по сути, накладываться поверх вашего представления. Поэтому, если вы поместите элемент пользовательского интерфейса в (0.0, 0.0) на iOS6, он появится ниже строки состояния, но на iOS7 он будет частично закрыт под строкой состояния. Поэтому в таком случае вам понадобится дельта, соответствующая высоте строки состояния (20,0 балла), чтобы макет выглядел одинаково в iOS6 и iOS7.

Я считаю, что это не нужно, если вы используете автозапуск, но, конечно же, вы теряете поддержку iPad1, которую многие из нас не желают уступать на данный момент времени.

Ответ 2

Примечание. Я заметил этот вопрос некоторое время назад, но теперь я только отправляю свой ответ, потому что NDA снят

Почему это не отображается для AutoLayout?

Как вы, возможно, заметили, iOS 7 предлагает совершенно новый вид. Внешний вид элементов пользовательского интерфейса изменился, но также имеет некоторые из их размеров (или показателей в целом). Это может создать дизайн интерфейса для размещения как iOS 7, так и предшественников, которые немного больно.

Официальная строка Apple должна использовать AutoLayout для решения этой проблемы; это должно занять много хлопот из выкладки элементов пользовательского интерфейса для вас. Иногда включение этого нелегко, особенно если вы по-прежнему должны поддерживать iOS 5 по соображениям бизнеса, или ваши интерфейсы управляются таким образом, что затрудняет реализацию AutoLayout. Таким образом, Apple, похоже, предоставила вам возможность сделать вашу работу немного легче, если вы попадете в эту нишу, и они назвали эту iOS 6/7 Deltas.

Хорошо, что он делает?

Хотя ярлык в Interface Builder немного неясен в отношении того, что означает "Delta", в этом контексте код, содержащийся в файле .xib, который соответствует этой функции, немного более ясен:

<inset key="insetFor6xAndEarlier" minX="-50" minY="-100" maxX="-50" maxY="300"/>

В ключевом названии insetFor6xAndEarlier явно указано, что это делает; вы можете предоставить альтернативные вставки для элементов пользовательского интерфейса при работе на предшественниках iOS 7. Например, вышесказанное определяет следующее изменение треугольника:

x: 50
y: 100
width: -100
height: 200

Пока значения, хранящиеся в .xib, напрямую не соответствуют цитированным значениям, между ними существует корреляция.

x: -minX
y: -minY
width: minX + maxX
height: minY + maxY

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

iOS7 View

iOS6 View

Вы можете заметить, что значения являются обратными для iOS 6; это потому, что дельта относится к типу просмотра, с которым вы работаете. Если вы редактируете iOS 6, дельта существует, чтобы правильно преобразовать элемент для iOS 7 (в обратном порядке выше).

Чтобы просмотреть разные стили, вы можете изменить способ создания интерфейса Builder на основе ОС, на котором он будет работать. Это содержится в документе "Файл инспектор- > Конструктор интерфейса" (первая вкладка на правой панели):

Interface Style Switch

Означает ли это, если мне нравится вручную управлять моим интерфейсом?

Не напрямую, но вы можете легко добиться такого же эффекта, получив условные проверки версии ОС в своем коде и соответствующим образом задав правильную позицию/размер. Дельта-способность существует в Interface Builder, потому что не было бы простого способа иметь условное позиционирование без кода, чтобы сделать это, а точка Interface Builder - сделать код максимально возможным для интерфейса пользователя.

В целом...

Apple настоятельно рекомендует использовать AutoLayout, это делает вашу жизнь проще в большинстве случаев. Если вы не можете использовать его (по причинам, указанным выше), дельта предоставляет вам возможность правильно позиционировать элементы пользовательского интерфейса, основываясь на текущих показателях операционной системы, без необходимости вручную переставлять их в коде. Хорошим примером является настройка отсутствия строки состояния, но есть много других вариантов использования.

Естественно, если вы только разрабатываете для iOS7 и выше, вам не нужно знать эту функцию/не обнаружите ее. Только если вам нужно иметь устройства iOS6, запускающие ваше приложение, когда они построены с помощью iOS7 SDK, без автозапуска, вам нужны дельта.

На момент написания статьи (21 августа) я не могу найти документацию об этой функции, а также никаких упоминаний в материалах WWDC. У меня была игра, и после небольшого исследования я узнал об этом.

Ответ 3

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

Прочтите это Руководство по переходу Apple - поддержка более ранней версии

Выберите "Просмотреть как" до "iOS 7.0 и более поздних версий"

enter image description here

Базовый интерфейс для iOS 7. Для iOS 6 дается соответствующее значение дельта. Используйте предварительный просмотр, чтобы увидеть, как это будет отображаться на устройствах iOS 7 и iOS 6.

enter image description here

Быстрые шаги:

Выберите каждого непосредственного дочернего элемента корневого просмотра отдельно и добавьте 20px к значению "Y".

enter image description here

Затем выберите все непосредственные дети вместе и дайте delta Y как -20px. Вы также можете делать это в пакетном режиме или по отдельности.

enter image description here

Ответ 4

Для AutoLayout требуется не менее iOS 6.0. Если вы хотите поддерживать iOS 5.0, вы не сможете использовать AutoLayout.

И эти дельта используются, чтобы помочь вам отрегулировать позицию представления на разных версиях iOS (в основном версии iOS 7 и iOS ниже 7).

Я использую эти значения, чтобы помочь мне, как эта картина. enter image description here

Ответ 5

Чтобы увидеть iOS 6/7 Delta в действии, я продемонстрирую с помощью SegmentedControl, который отображается правильно на устройствах iOS 6 и iOS 7.

Сначала выберите ваш .Xib или ViewController в раскадровке. Снимите флажок Использовать автозапуск и выберите " Просмотр как iOS 7 и более поздних версий"

enter image description here

В холсте Interface Builder разместите свой SegmentedControl так, чтобы его origin.y было 20. В iOS 6/7 Delta выберите -20 для DeltaY

enter image description here

Это сделает ваш SegmentedControl проложенным ниже строки состояния на устройствах iOS 6 и iOS 7.

enter image description hereenter image description here

Другие полезные цитаты из Руководство для разработчиков в строке состояния iOS 7

Deltas можно настроить индивидуально для каждого вида и работать так, как вы бы ожидать. Если ваш раскадровки или кибер установлен для просмотра как iOS 6, тогда установка дельта приведет к смещению и/или изменению вида по установленной величине delta при запуске в iOS 7. В качестве альтернативы, если ваш раскадровка или nib установлен для просмотра в iOS 7, тогда дельта будет применяется при запуске в iOS 6

Ответ 6

Если вы используете AutoLayout, то Delta недоступна. Попробуйте это (протестировано в iPhone 4s под управлением iOS6):

- (void) viewWillLayoutSubviews {

//iOS 6 workaround offset
if ([[[UIDevice currentDevice] systemVersion] floatValue] < 7) {

    self.view.clipsToBounds = YES;
    CGRect screenRect = [[UIScreen mainScreen] bounds];
    CGFloat screenHeight = 0.0;
    screenHeight = screenRect.size.width;
    CGRect screenFrame = CGRectMake(0, -20, self.view.frame.size.width,self.view.frame.size.height+10);

    self.view.frame = screenFrame;
}
}