Интерфейсный конструктор: для чего нужны дельты UIView Layout iOS 6/7?

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

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

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


person Frederick C. Lee    schedule 22.07.2013    source источник


Ответы (6)


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

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

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

person digarok    schedule 11.09.2013
comment
Для меня я обнаружил, что это дельта от iOS 7 до iOS 6. Я понизил свои элементы на 20 пунктов, затем установил -20 для дельты Y. - person abc123; 17.09.2013
comment
это особенно полезно с UIProgressView, который намного тоньше в iOS 7. - person Lee Probert; 27.09.2013

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

Почему он не отображается для 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-я вкладка на правой панели), а именно:

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

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

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

Общий...

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

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

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

person WDUK    schedule 18.09.2013
comment
Большое спасибо ВДУК - person Kamar Shad; 25.09.2013
comment
Пока нет свойств, вот что мне нужно было знать - person Jasper; 07.01.2014

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

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

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

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

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

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

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

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

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

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

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

person Saran    schedule 24.09.2013

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

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

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

person sunkehappy    schedule 17.09.2013
comment
Когда я меняю их, вообще ничего не происходит, есть ли еще один шаг? - person Recycled Steel; 19.09.2013
comment
@RecycledSteel смотрите мой ответ здесь: ссылка - person Riskov; 20.09.2013

Чтобы увидеть 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

person onmyway133    schedule 24.11.2013

Если вы используете 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;
}
}
person Marcelo dos Santos    schedule 28.07.2015