Безпечна область Xcode 9


150

Під час вивчення Xcode9 Beta знайдено безпечний простір для розробників інтерфейсів Перегляд ієрархічного перегляду. Мені цікаво і спробували дізнатися про документацію щодо безпечної області на яблуках, доктор док каже: "Область перегляду, яка безпосередньо взаємодіє з автоматичною компоновкою", але мене це не влаштовувало, я хочу знати практичне використання цієї нової речі.

У когось є якась підказка?

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

Параметр висновку від Apple doc для зони Safe.

Клас UILayoutGuide призначений для виконання всіх завдань, виконаних раніше за допомогою манекенів, але робити це більш безпечним та ефективним способом. Настанови макета не визначають новий вид. Вони не беруть участі в ієрархії перегляду. Натомість вони просто визначають прямокутну область у своїй системі координат подання, яка може взаємодіяти з автоматичною компонуванням.


1
Ви можете переглянути сесію WWDC. Там все пояснено. Я не впевнений у назві. Щось із назвою Xcode або InterfaceBuilder.
Maik639

Відповіді:


282

Безпечна зона - це посібник із компонування (Посібник із макетування безпечної області ) .
Посібник із компонування, що представляє частину вашого перегляду, яка не затьмарена барами та іншим вмістом. В iOS 11+ Apple Apple знецінює верхні та нижні напрямні макета та замінює їх одним єдиним посібником щодо макета безпечної області.

Коли вигляд видно на екрані, цей посібник відображає частину перегляду, яка не охоплена іншим вмістом. Безпечна область перегляду відображає зону, охоплену панелями навігації, панелями вкладок, панелями інструментів та іншими предками, які затемнюють подання контролера подання. (У tvOS безпечна область містить рамку екрана, як визначено overscanCompensationInsetsвластивістю UIScreen.) Він також охоплює будь-який додатковий простір, визначений additionalSafeAreaInsetsвластивістю контролера перегляду . Якщо представлення наразі не встановлено в ієрархії подання, або його ще не видно на екрані, керівництво по компонуванню завжди відповідає краям подання.

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

Відповідно до Apple, Xcode 9 - Примітка до випуску
Interface Builder використовує UIView.safeAreaLayoutGuide як заміну для застарілих посібників із верхнім і нижнім розміщенням у UIViewController. Щоб використовувати нову безпечну зону, виберіть Посібники з безпечної розмітки області в інспекторі файлів для контролера перегляду, а потім додайте обмеження між вмістом та новими якорями безпечної області. Це запобігає затьмаренню вашого вмісту верхньою та нижньою смугами та областю надмірного масштабу на tvOS. Обмеження в безпечній зоні перетворюються на верхню та нижню при розміщенні на більш ранніх версіях iOS.

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


Ось проста довідка як порівняння (щоб зробити подібний візуальний ефект) між існуючими (Поверхня та нижня) інструкцією щодо макета та керівництвом щодо безпечної компонування області.

Макет безпечної зони: введіть тут опис зображення

Автоматична розкладка

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


Як працювати з безпечним макетом зони?

Виконайте наступні дії, щоб знайти рішення:

  • Увімкніть "Безпечний макет області", якщо його не ввімкнено.
  • Видаліть "всі обмеження", якщо вони показують зв'язок із Super View і знову приєднайте всі із захисним якорем. АБО Двічі клацніть на обмеження і відредагуйте з'єднання від суперпрогляду до якоря SafeArea

Ось зразок знімка, як увімкнути безпечне розташування області та редагувати обмеження.

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

Ось результат вищезгаданих змін

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


Дизайн макета з SafeArea
При розробці для iPhone X ви повинні переконатися, що макети заповнюють екран і не затьмарюються закругленими кутами пристрою, корпусом датчика або індикатором доступу до головного екрану.

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

Більшість додатків, які використовують стандартні, надані системою елементи інтерфейсу, такі як панелі навігації, таблиці та колекції, автоматично адаптуються до нового форм-фактору пристрою. Фонові матеріали поширюються на краї дисплея, а елементи інтерфейсу належним чином вставлені та розміщені.

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

Для додатків із власноручними розкладками підтримка iPhone X також повинна бути відносно легкою, особливо якщо ваш додаток використовує функцію автоматичного макета та дотримується посібників із макетом безпечної зони та поля.

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


Ось приклад коду (посилання від: Посібник з макета безпечної області ) :
Якщо ви створюєте свої обмеження в коді, використовуйте властивість safeAreaLayoutGuide UIView, щоб отримати відповідні якорі макета. Давайте відтворимо вищевказаний приклад Interface Builder у коді, щоб побачити, як це виглядає:

Якщо припустити, що в нашому контролері подання зображень зелений вид є властивістю:

private let greenView = UIView()

У нас може бути функція налаштування поглядів і обмежень, викликаних з viewDidLoad:

private func setupView() {
  greenView.translatesAutoresizingMaskIntoConstraints = false
  greenView.backgroundColor = .green
  view.addSubview(greenView)
}

Створіть провідні та кінцеві обмеження поля, як завжди, використовуючи layoutMarginsGuide кореневого виду:

 let margins = view.layoutMarginsGuide
    NSLayoutConstraint.activate([
      greenView.leadingAnchor.constraint(equalTo: margins.leadingAnchor),
      greenView.trailingAnchor.constraint(equalTo: margins.trailingAnchor)
 ])

Тепер, якщо ви не орієнтуєтесь лише на iOS 11, вам потрібно буде обернути обмеження керівництва щодо безпечної області на #available і повернутися до верхніх і нижніх посібників для верстки для попередніх версій iOS:

if #available(iOS 11, *) {
  let guide = view.safeAreaLayoutGuide
  NSLayoutConstraint.activate([
   greenView.topAnchor.constraintEqualToSystemSpacingBelow(guide.topAnchor, multiplier: 1.0),
   guide.bottomAnchor.constraintEqualToSystemSpacingBelow(greenView.bottomAnchor, multiplier: 1.0)
   ])

} else {
   let standardSpacing: CGFloat = 8.0
   NSLayoutConstraint.activate([
   greenView.topAnchor.constraint(equalTo: topLayoutGuide.bottomAnchor, constant: standardSpacing),
   bottomLayoutGuide.topAnchor.constraint(equalTo: greenView.bottomAnchor, constant: standardSpacing)
   ])
}


Результат:

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


Після UIViewрозширення полегшуйте програму для роботи з SafeAreaLayout.

extension UIView {

  // Top Anchor
  var safeAreaTopAnchor: NSLayoutYAxisAnchor {
    if #available(iOS 11.0, *) {
      return self.safeAreaLayoutGuide.topAnchor
    } else {
      return self.topAnchor
    }
  }

  // Bottom Anchor
  var safeAreaBottomAnchor: NSLayoutYAxisAnchor {
    if #available(iOS 11.0, *) {
      return self.safeAreaLayoutGuide.bottomAnchor
    } else {
      return self.bottomAnchor
    }
  }

  // Left Anchor
  var safeAreaLeftAnchor: NSLayoutXAxisAnchor {
    if #available(iOS 11.0, *) {
      return self.safeAreaLayoutGuide.leftAnchor
    } else {
      return self.leftAnchor
    }
  }

  // Right Anchor
  var safeAreaRightAnchor: NSLayoutXAxisAnchor {
    if #available(iOS 11.0, *) {
      return self.safeAreaLayoutGuide.rightAnchor
    } else {
      return self.rightAnchor
    }
  }

}

Ось зразок коду в Objective-C :


Ось офіційна документація для розробника Apple для керівництва по безпечній макеті області


Безпечна зона необхідна для обробки дизайну інтерфейсу користувача для iPhone-X. Ось основні вказівки щодо того, як створити користувальницький інтерфейс для iPhone-X за допомогою Safe Area Layout


Що стосується різниці між marginsта view.leadingAnchor: коли ви використовуєте let margins = view.layoutMarginsGuideта використовуєте їх пізніше margins.leadingAnchor, ви обмежуєте погляд до меж поля перегляду. Це додасть додаткового простору сторонам. Якщо ви цього не хочете, просто використовуйте view.leadingAnchorі view.trailingAnchorви не побачите білого пробілу зліва чи справа ...
Honey

"Безпечна область перегляду відображає зону, охоплену панелями навігації, панелями вкладок, панелями інструментів та іншими предками, які затьмарюють подання контролера перегляду" Ви не маєте на увазі не охоплений? У документі йдеться про " неприховане барами та іншим вмістом".
Мед

Я бачив дивну поведінку в Xcode 10.1, коли безпечна зона не поширювалася б у нижній частині екрана на повноекранному огляді. Я вважаю, що я спричинив це, випадково перетягнувши «Панель вкладок» на дно, а потім видаливши її. Я знайшов цей рядок у файлі .storyboard, який я вручну видалив за допомогою текстового редактора. <simuliranToolbarMetrics key = "симульованийBottomBarMetrics" />. Це і виправило.
Дейв Хаббард

20

Я хочу відзначити те , що зловив мене перший , коли я намагався пристосувати її SpriteKit основі , щоб уникнути закруглені краї і «борозенки» нового iPhone X, як це було запропоновано останнім Керівництва Human Interface : Нова властивість safeAreaLayoutGuideвід UIViewпотреби в отримувати запит після того, як подання буде додано до ієрархії (наприклад, увімкнено -viewDidAppear:), щоб повідомити про змістовний кадр макета (в іншому випадку він просто повертає повноекранний розмір).

З документації на майно:

Посібник із компонування, що представляє частину вашого перегляду, яка не затьмарена барами та іншим вмістом. Коли вид відображається на екрані , цей посібник відображає частину подання, яка не охоплена навігаційними панелями, панелями вкладок, панелями інструментів та іншими видами предків. (У tvOS безпечна область відображає область, не охоплена рамкою екрана.) Якщо подання наразі не встановлено в ієрархії перегляду або ще не видно на екрані, краї направляючих макетів рівні рівним краям подання .

(наголос мій)

Якщо ви прочитаєте його раніше -viewDidLoad:, layoutFrameкерівництво буде {{0, 0}, {375, 812}}замість очікуваного{{0, 44}, {375, 734}}


Те ж саме. Я завжди переглядаю доступні властивості типу, керуючись лише їх іменами, не читаючи повністю документів ...
Nicolas Miari

18

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

  • Раніше прошивкою 7.0-11.0 < Застарілі > UIKitвикористовує topLayoutGuide & bottomLayoutGuide який є UIViewвласністю
  • iOS11 + використовує safeAreaLayoutGuide, який також є UIViewвласністю

  • Увімкнути безпечною компоновкою області від інспектора файлів.

  • Безпечні зони допомагають розмістити свої погляди у видимій частині загального інтерфейсу.

  • В tvOS безпечна зона також включає вкладені вкладиші екрану, які представляють область, покриту рамкою екрана.

  • safeAreaLayoutGuide відображає частину виду, яка не охоплена навігаційними панелями, панелями вкладок, панелями інструментів та іншими видами перегляду предків.
  • Використовуйте безпечні зони як допоміжний засіб для розміщення вмісту, наприклад UIButton тощо.

  • При розробці для iPhone X ви повинні переконатися, що макети заповнюють екран і не затьмарюються закругленими кутами пристрою, корпусом датчика або індикатором доступу до головного екрану.

  • Переконайтеся, що фони простягаються до країв дисплея, а вертикальні прокручувані макети, як таблиці та колекції, продовжують донизу.

  • Рядок стану на iPhone X вище, ніж на інших iPhone. Якщо ваш додаток передбачає фіксовану висоту рядка стану для розміщення вмісту нижче рядка стану, ви повинні оновити додаток для динамічного розміщення вмісту на основі пристрою користувача. Зауважте, що статус стану на iPhone X не змінює висоту, коли активні фонові завдання, такі як запис голосу та відстеження місцеположення print(UIApplication.shared.statusBarFrame.height)//44 for iPhone X, 20 for other iPhones

  • Висота домашнього індикаторного контейнера - 34 бали.

  • Після ввімкнення Посібника з безпечної компонування області ви можете побачити властивість обмежених територій, вказані в конструкторі інтерфейсів.

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

Ви можете встановити обмеження відповідно до self.view.safeAreaLayoutGuide як-

ObjC:

  self.demoView.translatesAutoresizingMaskIntoConstraints = NO;
    UILayoutGuide * guide = self.view.safeAreaLayoutGuide;
    [self.demoView.leadingAnchor constraintEqualToAnchor:guide.leadingAnchor].active = YES;
    [self.demoView.trailingAnchor constraintEqualToAnchor:guide.trailingAnchor].active = YES;
    [self.demoView.topAnchor constraintEqualToAnchor:guide.topAnchor].active = YES;
    [self.demoView.bottomAnchor constraintEqualToAnchor:guide.bottomAnchor].active = YES;

Швидкий:

   demoView.translatesAutoresizingMaskIntoConstraints = false
        if #available(iOS 11.0, *) {
            let guide = self.view.safeAreaLayoutGuide
            demoView.trailingAnchor.constraint(equalTo: guide.trailingAnchor).isActive = true
            demoView.leadingAnchor.constraint(equalTo: guide.leadingAnchor).isActive = true
            demoView.bottomAnchor.constraint(equalTo: guide.bottomAnchor).isActive = true
            demoView.topAnchor.constraint(equalTo: guide.topAnchor).isActive = true
        } else {
            NSLayoutConstraint(item: demoView, attribute: .leading, relatedBy: .equal, toItem: view, attribute: .leading, multiplier: 1.0, constant: 0).isActive = true
            NSLayoutConstraint(item: demoView, attribute: .trailing, relatedBy: .equal, toItem: view, attribute: .trailing, multiplier: 1.0, constant: 0).isActive = true
            NSLayoutConstraint(item: demoView, attribute: .bottom, relatedBy: .equal, toItem: view, attribute: .bottom, multiplier: 1.0, constant: 0).isActive = true
            NSLayoutConstraint(item: demoView, attribute: .top, relatedBy: .equal, toItem: view, attribute: .top, multiplier: 1.0, constant: 0).isActive = true
        }

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

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

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


Я вважаю цей посібник з точки кулі дуже корисним, але що саме означає "безпечна зона, яка не охоплює панелі навігації, панелі вкладок, панелі інструментів та інші види пращурів"?
Chewie The Chorkie

1
Приклад - Як і в останній панелі інструментів останнього екрана (сьогодні календарі та вхідні), яка не охоплена safreAreaGuide
Джек

8

Apple представила topLayoutGuide та bottomLayoutGuide як властивості UIViewController ще в iOS 7. Вони дозволили вам створити обмеження, щоб ваш вміст не приховувався барами UIKit, такими як статус, навігація чи панель вкладок. Ці довідники компонування застаріли в iOS 11 і замінені єдиним поводом щодо макета безпечної області.

Перейдіть за посиланням для отримання додаткової інформації.


5

Посібник із макету безпечної області допомагає уникнути непокриття елементів системного інтерфейсу під час розміщення вмісту та елементів керування.

Безпечна область - це область між елементами інтерфейсу системи, яка є рядком стану, панеллю навігації та панеллю інструментів або панелкою вкладок. Тож коли ви додасте рядок стану до своєї програми, безпечна зона зменшується. Додавши навігаційну панель у додаток, безпечна зона знову зменшується.

На iPhone X Safe Area забезпечує додатковий вклад з верхнього та нижнього країв екрану в портретному режимі, навіть коли не відображається смуга. У пейзажному режимі безпечна зона розміщена з боків екранів та домашнього індикатора.

Це взято з відео Apple Designing для iPhone X, де вони також візуалізують, як різні елементи впливають на безпечну зону.

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.