Я только что заметил свойство iOS 6/7 Delta, находящееся под макетом структур UIView.
Для чего это нужно и почему этого нет в AutoLayout?
Я только что заметил свойство iOS 6/7 Delta, находящееся под макетом структур UIView.
Для чего это нужно и почему этого нет в AutoLayout?
Ответы:
Фактически это относится к разнице между положением макета от iOS6 до iOS7.
В iOS7 некоторые представления могут скрывать строку состояния или делать ее прозрачной, и, по сути, она накладывается поверх вашего представления. Поэтому, если вы поместите элемент пользовательского интерфейса в (0.0, 0.0) в iOS6, он появится под строкой состояния, но в iOS7 он будет частично скрыт под строкой состояния. Поэтому в этом случае вам понадобится дельта, соответствующая высоте строки состояния (20,0 балла), чтобы макет выглядел одинаково в iOS6 и iOS7.
Я считаю, что в этом нет необходимости, если вы используете автопрокладку, но, конечно, вы теряете поддержку iPad1, от которой многие из нас пока не хотят отказываться.
Примечание: я заметил этот вопрос некоторое время назад, но сейчас я публикую свой ответ только потому, что NDA было отменено.
Как вы могли заметить, 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
На изображениях ниже это изменение показано визуально. Это довольно экстремальный пример, но он демонстрирует свои возможности. На практике я ожидал бы изменения дельты всего в несколько пикселей.
Вы можете заметить, что значения являются обратными для представления 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. У меня была небольшая игра, и после небольшого исследования я обнаружил именно это.
Я знаю, что на этот вопрос уже был дан ответ, просто добавив небольшой вариант, надеясь, что он также поможет тем, кто не использует автоматическую компоновку и все еще хочет поддерживать iOS 6.1 и более ранние версии.
Прочтите это Руководство Apple по переходу - Поддержка более ранней версии
Выберите «Просмотреть как» для «iOS 7.0 и более поздних версий».
Базовый интерфейс для iOS 7. Для iOS 6 укажите подходящее значение дельты. Используйте предварительный просмотр, чтобы увидеть, как это будет отображаться на устройстве iOS 7 и iOS 6.
Быстрые шаги:
Выберите каждого непосредственного потомка корневого представления индивидуально и добавьте 20 пикселей к его значению «Y».
Затем выберите всех непосредственных потомков вместе и задайте дельту Y как -20 пикселей. Вы также можете сделать это партиями или индивидуально.
Для AutoLayout требуется iOS не ниже 6.0. Если вы хотите поддерживать iOS 5.0, вы не можете использовать AutoLayout.
И эти дельты используются, чтобы помочь вам настроить положение просмотра в другой версии iOS (в основном iOS 7 и версия iOS ниже 7).
Я использую это значение, чтобы мне понравилась эта картинка.
Чтобы увидеть 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
Если вы используете 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;
}
}