Исключить панель навигации из iOS "Безопасная зона" - PullRequest
0 голосов
/ 16 мая 2018

В моем iOS-приложении под панелью навигации отображаются виды. Это связано с тем, что панель навигации скрыта до тех пор, пока пользователь не коснется экрана.

Скриншоты ниже иллюстрируют мою проблему.

Кнопка «X» отображается под вырезом iPhone X и едва различима. Это когда я ограничиваю topAnchor кнопки superview!.topAnchor.

Обратите внимание, что это работает так, как задумано для всех устройств, кроме iPhone X.

enter image description here

Кнопка «X» на этом скриншоте привязана к superview!.safeAreaLayoutGuide.topAnchor и отображается под панелью навигации. Это имеет смысл, учитывая документацию Apple по safeAreaLayoutGuide:

"это руководство отражает часть вида, которая не покрыта панелями навигации, панелями вкладок, панелями инструментов и другими видами предков."

enter image description here

Однако я хочу, чтобы кнопка «X» отображалась ниже метки iPhone X и под панелью навигации. Вот как это выглядит, когда панель навигации скрыта:

enter image description here

Кнопка "X" должна отображаться прямо под надрезом.

Итак, мой вопрос:

Есть ли способ исключить панель навигации из safeAreaLayoutGuide представления? А если нет, какие у меня варианты, кроме ручного смещения кнопки на iPhone X.

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

Спасибо!

Ответы [ 2 ]

0 голосов
/ 12 февраля 2019

Вы можете изменить вид вставок безопасной области контроллеров, добавив дополнительные вставки.Создайте объект UIEdgeInsetsMake(), в котором вычитаете высоту панели навигации из верхней вставки.Затем добавьте его в View Controllers additionalSafeAreaInsets.

Декларация: var additionalSafeAreaInsets: UIEdgeInsets { get set }

0 голосов
/ 16 мая 2018

Это не ответ, а обходной путь:

  1. Сохраните ссылку на верхнее ограничение кнопки "X".
  2. В layoutSubviews() обновите константуверхнее ограничение в зависимости от суперпредставления "X" и окна safeAreaInsets.

override func layoutSubviews() {
    // To support devices with a "safe area". If the receiver has a top safe area, position
    // the close button beneath the _window's_ safe area.
    // Note that using the receiver's safe area does not work in this case because it includes
    // the navigation bar. We want to render the close button beneath the navigation bar.

    let windowSafeAreaInsets = UIApplication.shared.keyWindow!.safeAreaInsets

    // Only use the safe area if the receiver _and_ window have a top safe area. This handles
    // the case of non-safe area devices using a hidden navigation bar.
    closeButtonTopConstraint.constant = safeAreaInsets.top > 0 && windowSafeAreaInsets != .zero
            ? windowSafeAreaInsets.top : 16

    // Possibly do something similar for landscape and the "X" button's trailing constraint.
}
...