Интерфейсный Разработчик: Для чего нужны UIView Layout iOS 6/7 Delta?
Я только что заметил свойство Delta для iOS 6/7, найденное под макетом структур UIView.
Для чего это нужно и почему этого не хватает в AutoLayout?
6 ответов
Это на самом деле относится к дельте между позицией расположения от iOS6 до iOS7.
В iOS7 некоторые представления могут скрывать строку состояния или иметь ее прозрачной, и, по сути, она накладывается поверх вашего представления. Поэтому, если вы поместите элемент пользовательского интерфейса в (0.0, 0.0) на iOS6, он появится под строкой состояния, но на iOS7 он будет частично закрыт под строкой состояния. Так что в этом случае вы бы хотели, чтобы дельта соответствовала высоте строки состояния (20,0 балла), чтобы макет выглядел одинаково в iOS6 и iOS7.
Я полагаю, что в этом нет необходимости, если вы используете автопрокладку, но, конечно, тогда вы потеряете поддержку iPad1, что многие из нас не хотят уступать в данный момент.
Примечание: я заметил этот вопрос некоторое время назад, но я только публикую свой ответ, потому что NDA был отменен
Почему он не отображается для AutoLayout?
Как вы могли заметить, iOS 7 привносит совершенно новый облик. Внешний вид элементов пользовательского интерфейса изменился, но также изменились некоторые их размеры (или метрики в целом). Это может сделать дизайн интерфейса для iOS 7 и его предшественников немного болезненным.
Официальная линия Apple - использовать AutoLayout для решения этой проблемы; это должно избавить вас от необходимости выкладывать элементы пользовательского интерфейса. Иногда внедрить это нелегко, особенно если вам по-прежнему необходимо поддерживать iOS 5 по деловым причинам или ваши интерфейсы управляются таким образом, что затрудняет реализацию AutoLayout. Таким образом, Apple, кажется, предоставила способ немного упростить вашу работу, если вы попадаете в эту нишевую категорию, и они назвали это iOS 6/7 Deltas.
Хорошо, тогда что это делает?
Хотя метка в Интерфейсном Разработчике немного неясна, что означает "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
Изображения ниже показывают это изменение визуально. Это довольно экстремальный пример, но он демонстрирует свои способности. Я ожидал бы, что на практике изменения дельты будут всего лишь в несколько пикселей.
Вы можете заметить, что значения являются обратными для представления iOS 6; это потому, что дельты связаны с типом представления, с которым вы работаете. Если вы редактируете для iOS 6, существуют дельты, чтобы правильно преобразовать элемент для iOS 7 (обратный пример выше).
Чтобы просмотреть различные стили, вы можете изменить способ представления Интерфейсного Разработчика в зависимости от ОС, на которой он будет работать. Это содержится в File Inspector->Interface Builder Document (1-я вкладка на правой панели) следующим образом:
Существует ли это, если я хочу написать свой интерфейс вручную?
Не напрямую, но вы можете легко добиться того же эффекта, если в вашем коде выполните условную проверку версии ОС и соответственно установите правильную позицию / размер. Дельта-способность существует в Интерфейсном Разработчике, потому что не было бы прямого способа иметь условное позиционирование без кода, чтобы сделать это, и цель Интерфейсного Разработчика состоит в том, чтобы получить как можно больше кода для пользовательского интерфейса.
В общем и целом...
Apple настоятельно рекомендует использовать AutoLayout, это облегчает вашу жизнь в большинстве случаев. Если вы не можете использовать его (по причинам, указанным выше), дельты предоставляют вам гибкость для правильного размещения элементов пользовательского интерфейса на основе показателей текущей ОС, без необходимости вручную перемещать их в коде. Хорошим примером является настройка отсутствия строки состояния, но есть множество других вариантов использования.
Естественно, если вы разрабатываете только для iOS7 и выше, вам не нужно знать эту функцию / не обнаружит ее. Только в том случае, если вам нужно, чтобы приложение iOS6 работало с вашим приложением при сборке с iOS7 SDK, без автоматической разметки, вам нужны дельты.
На момент написания статьи (21 августа) я не смог найти ни документации, касающейся этой функции, ни упоминаний в материале WWDC. У меня была тренировка, и после небольшого исследования, это то, что я обнаружил.
Я знаю, что на этот вопрос уже дан ответ, просто добавив небольшой вариант, надеясь, что он также может помочь тем, кто не использует автоматическую разметку и все еще хочет поддерживать iOS 6.1 и более ранние версии.
Прочитайте это руководство по переходу от Apple - поддержка более ранней версии
Выберите "Просмотреть как" для "iOS 7.0 и более поздних версий"
Базовый интерфейс для iOS 7. Для iOS 6 укажите подходящее значение дельты. Используйте предварительный просмотр, чтобы увидеть, как это будет отображаться в iOS 7 и iOS 6.
Быстрые шаги:
Выберите каждого непосредственного потомка корневого представления индивидуально и добавьте 20px к его значению "Y".
Затем выберите всех ближайших потомков и задайте для дельты Y значение -20px. Вы также можете сделать это в пакетном режиме или индивидуально.
Для AutoLayout требуется как минимум iOS 6.0. Если вы хотите поддерживать iOS 5.0, вы не можете использовать AutoLayout.
И эти дельты используются для того, чтобы помочь вам отрегулировать позицию просмотра в разных версиях iOS (в основном iOS 7 и версия iOS ниже 7).
Я использую эти значения, чтобы помочь мне, как эта картина.
Чтобы увидеть iOS 6/7 Delta в действии, я продемонстрирую SegmentedControl, который правильно отображается на устройствах iOS 6 и iOS 7.
Сначала выберите ваш.Xib или ViewController в раскадровке. Снимите флажок Использовать Autolayout и выберите " Просмотреть как iOS 7 и более поздние версии "
На холсте Интерфейсного Разработчика поместите свой 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;
}
}