Інтерфейс-конструктор: для чого призначений Delta Delta для версії iOS 6/7 UIView?


111

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

Для чого це і чому цього не вистачає в AutoLayout?

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

Відповіді:


83

Це насправді стосується Delta між положенням макета від iOS6 до iOS7.

У iOS7 деякі перегляди можуть приховувати рядок стану або зробити його прозорим і, фактично, він накладений поверх вашого перегляду. Отже, якщо ви поставите елемент інтерфейсу на (0,0, 0,0) на iOS6, він з’явиться нижче рядка стану, але на iOS7 він буде частково прикритий під рядком стану. Тож у такому випадку ви хочете дельту, яка відповідає висоті рядка стану (20,0 балів), щоб макет виглядав однаково в iOS6 та iOS7.

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


27
Для мене я виявив, що це дельта від iOS 7 до iOS 6. Я знизив елементи на 20 балів, потім встановив -20 для Delta Y.
Гуптрон

це особливо корисно для UIProgressView, який набагато тонше в iOS 7
Лі Проберт,

108

Примітка. Це питання я помітив деякий час тому назад, але зараз я лише публікую свою відповідь, оскільки НДА було скасовано

Чому вона не відображається для AutoLayout?

Як ви, можливо, помітили, iOS 7 наводить зовсім новий вигляд. Зовнішній вигляд елементів інтерфейсу змінився, але також мав деякі свої розміри (або показники загалом). Це може зробити дизайн інтерфейсу для розміщення обох iOS 7, і це попередників трохи відчуває біль.

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

Гаразд, що це робить?

Хоча мітка в 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

На малюнках нижче показано цю зміну візуально. Це досить екстремальний приклад, але це продемонструвати його здібності. Я лише очікував би, що зміни на дельті мають лише кілька пікселів.

iOS7 Перегляд

iOS6 Перегляд

Ви можете помітити, що значення є оберненими для перегляду iOS 6; це тому, що дельти відносяться до типу перегляду, з яким ви працюєте. Якщо ви редагуєте для iOS 6, дельти існують для того, щоб перетворити елемент правильно для iOS 7 (зворотний приклад вище).

Щоб переглянути різні стилі, ви можете змінити спосіб представлення інтерфейсу на основі ОС, на якій він буде працювати. Це міститься в документі File Inspector-> Document Builder Document (1-я вкладка праворуч) так:

Перемикач стилю інтерфейсу

Чи існує це, якщо мені подобається кодувати інтерфейс вручну?

Не безпосередньо, але ви можете легко досягти такого ж ефекту, провівши умовні перевірки версії ОС у вашому коді та відповідно встановивши правильне положення / розмір. Здатність дельти існує в Interface Builder, оскільки не було б прямого способу мати умовне позиціонування, не маючи коду для цього, а сенс Interface Builder полягає в тому, щоб вивести якомога більше коду, що можливо, для інтерфейсу користувача.

Загалом ...

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

Природно, якщо ви розробляєте лише для iOS7 і вище, вам не потрібно знати цю функцію / не відкриватимете її. Тільки якщо вам потрібно мати пристрої iOS6 для запуску вашої програми під час створення з iOS7 SDK, без автоматичного розміщення, вам потрібні дельти.

На момент написання (21 серпня) я не можу знайти жодної документації щодо цієї функції, а також жодних згадок у матеріалі WWDC. У мене була гра, і після невеликих досліджень це я виявив.


2
Дуже дякую WDUK
Kamar Shad

Поки що немає властивостей, ось що мені потрібно було знати
Джаспер

30

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

Прочитайте цей посібник із переходу Apple - підтримка попередньої версії

Виберіть "Переглянути як" до "iOS 7.0 та новіших версій"

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

Базовий інтерфейс для iOS 7. Для iOS 6 дайте відповідне дельта-значення. Використовуйте попередній перегляд, щоб побачити, як це відобразиться на пристроях iOS 7 та iOS 6.

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

Швидкі кроки:

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

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

Потім виберіть усіх безпосередніх дітей спільно та дайте дельту Y як -20px. Ви також можете зробити це партією або окремо.

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


9

Для автоматичної розробки потрібен принаймні iOS 6.0. Якщо ви хочете підтримати iOS 5.0, ви не можете використовувати AutoLayout.

Ці дельти використовуються, щоб допомогти вам відрегулювати положення перегляду в різних версіях iOS (головним чином, iOS 7 та iOS версії нижче 7).

Я використовую ці значення, щоб допомогти мені, як ця картина. введіть тут опис зображення


1
Коли я змінюю це, то взагалі нічого не відбувається, чи є ще один крок?
Перероблена сталь

@RecycledSteel дивіться мою відповідь тут: посилання
Рісков

3

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

Спочатку виберіть свій .Xib або ViewController на аркуші розгортки. Зніміть прапорець Використовуйте автоматичну розстановку та виберіть " Переглянути як iOS 7 та новіші версії "

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

На полотні 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.