Разработчик интерфейса: для чего нужны дельты iOS 6/7 макета UIView?


111

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

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

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

Ответы:


83

Фактически это относится к разнице между положением макета от iOS6 до iOS7.

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

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


27
Что касается меня, я обнаружил, что это дельта от iOS 7 до iOS 6. Я снизил свои элементы на 20 пунктов, затем установил -20 для Delta Y.
guptron

это особенно полезно с UIProgressView, который намного тоньше в iOS 7
Ли Проберт,

108

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

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

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

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

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

В то время как метка в Interface Builder немного неясна относительно того, что означает «Дельта» в этом контексте, код, содержащийся в файле .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 Просмотр

iOS6 Просмотр

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

Чтобы просмотреть различные стили, вы можете изменить способ их представления в Interface Builder в зависимости от ОС, в которой он будет работать. Это содержится в документе File Inspector-> Interface Builder (1-я вкладка на правой панели), а именно:

Переключатель стиля интерфейса

Есть ли это, если мне нравится кодировать свой интерфейс вручную?

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

В общем и целом...

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

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

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


2
Большое спасибо WDUK
Камар Шад

Пока нет объектов недвижимости, это то, что мне нужно было знать
Джаспер

30

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

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

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

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

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

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

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

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

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

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

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


9

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

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

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


1
Когда я их меняю, вообще ничего не происходит, есть ли еще один шаг?
Recycled Steel

@RecycledSteel см. Мой ответ здесь: ссылка
Рисков

3

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

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

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

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

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

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

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

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

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


0

Если вы используете 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;
}
}
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.