Я только что заметил свойство Delta iOS 6/7, найденное в макете структуры UIView.
Для чего это и почему это отсутствует в AutoLayout?
Я только что заметил свойство Delta iOS 6/7, найденное в макете структуры UIView.
Для чего это и почему это отсутствует в AutoLayout?
Это фактически относится к Delta между расположением макета от 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 немного неясен в отношении того, что означает "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 (в обратном порядке выше).
Чтобы просмотреть разные стили, вы можете изменить способ создания интерфейса Builder на основе ОС, на котором он будет работать. Это содержится в документе "Файл инспектор- > Конструктор интерфейса" (первая вкладка на правой панели):
Не напрямую, но вы можете легко добиться такого же эффекта, получив условные проверки версии ОС в своем коде и соответствующим образом задав правильную позицию/размер. Дельта-способность существует в Interface Builder, потому что не было бы простого способа иметь условное позиционирование без кода, чтобы сделать это, а точка Interface Builder - сделать код максимально возможным для интерфейса пользователя.
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".
Затем выберите все непосредственные дети вместе и дайте delta 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 в раскадровке. Снимите флажок Использовать автозапуск и выберите " Просмотр как iOS 7 и более поздних версий"
В холсте Interface Builder разместите свой SegmentedControl так, чтобы его origin.y было 20. В iOS 6/7 Delta выберите -20 для DeltaY
Это сделает ваш SegmentedControl проложенным ниже строки состояния на устройствах iOS 6 и iOS 7.
Другие полезные цитаты из Руководство для разработчиков в строке состояния iOS 7
Deltas можно настроить индивидуально для каждого вида и работать так, как вы бы ожидать. Если ваш раскадровки или кибер установлен для просмотра как iOS 6, тогда установка дельта приведет к смещению и/или изменению вида по установленной величине delta при запуске в iOS 7. В качестве альтернативы, если ваш раскадровка или nib установлен для просмотра в 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;
}
}