Щойно я помітив властивість Delta iOS 6/7 Delta, знайдене під компонуванням структур UIView.
Для чого це і чому цього не вистачає в AutoLayout?
Щойно я помітив властивість Delta iOS 6/7 Delta, знайдене під компонуванням структур UIView.
Для чого це і чому цього не вистачає в AutoLayout?
Відповіді:
Це насправді стосується Delta між положенням макета від iOS6 до iOS7.
У iOS7 деякі перегляди можуть приховувати рядок стану або зробити його прозорим і, фактично, він накладений поверх вашого перегляду. Отже, якщо ви поставите елемент інтерфейсу на (0,0, 0,0) на iOS6, він з’явиться нижче рядка стану, але на iOS7 він буде частково прикритий під рядком стану. Тож у такому випадку ви хочете дельту, яка відповідає висоті рядка стану (20,0 балів), щоб макет виглядав однаково в iOS6 та iOS7.
Я вважаю, що це не потрібно, якщо ви використовуєте автоматичний розклад, але, звичайно, тоді ви втрачаєте підтримку iPad1, яку багато хто з нас не бажають поступатися в цей час.
Примітка. Це питання я помітив деякий час тому назад, але зараз я лише публікую свою відповідь, оскільки НДА було скасовано
Як ви, можливо, помітили, 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
На малюнках нижче показано цю зміну візуально. Це досить екстремальний приклад, але це продемонструвати його здібності. Я лише очікував би, що зміни на дельті мають лише кілька пікселів.
Ви можете помітити, що значення є оберненими для перегляду iOS 6; це тому, що дельти відносяться до типу перегляду, з яким ви працюєте. Якщо ви редагуєте для iOS 6, дельти існують для того, щоб перетворити елемент правильно для iOS 7 (зворотний приклад вище).
Щоб переглянути різні стилі, ви можете змінити спосіб представлення інтерфейсу на основі ОС, на якій він буде працювати. Це міститься в документі File Inspector-> Document Builder Document (1-я вкладка праворуч) так:
Не безпосередньо, але ви можете легко досягти такого ж ефекту, провівши умовні перевірки версії ОС у вашому коді та відповідно встановивши правильне положення / розмір. Здатність дельти існує в 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.
Швидкі кроки:
Виберіть кожного безпосереднього домену кореневого виду окремо та додайте 20 пікселів до його значення "Y".
Потім виберіть усіх безпосередніх дітей спільно та дайте дельту Y як -20px. Ви також можете зробити це партією або окремо.
Для автоматичної розробки потрібен принаймні 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 та новіші версії "
На полотні 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;
}
}