Дополнительное нижнее пространство/дополнение на iPhone X?

В iPhone X в портретном режиме, если вы установите нижнее ограничение в безопасную область на 0, вы получите дополнительное пространство в нижней части экрана. Как вы программно увеличиваете это дополнительное дополнение?

Мне удалось вручную определить высоту этого дополнения, которое составляет 34, и вот как мне удалось реализовать его с обнаружением iPhone X:

Swift 4.0 и Xcode 9.0

if UIDevice().userInterfaceIdiom == .phone
{
    switch UIScreen.main.nativeBounds.height
    {
        case 2436: //iPhone X
        self.keyboardInAppOffset.constant = -34.0
        default:
        self.keyboardInAppOffset.constant = 0
    }
}

Есть ли более чистый способ определить высоту этого дополнения?

Ответы

Ответ 1

В iOS 11 представления имеют свойство safeAreaInsets. Если вы получаете свойство bottom этих вложений, вы можете получить высоту нижнего отступов, находясь на iPhone X:

if #available(iOS 11.0, *) {
    let bottomPadding = view.safeAreaInsets.bottom
    // ...
}

(аналогично верхнему заполнению со строкой состояния)

Ответ 2

В Objective-C

if (@available(iOS 11.0, *)) {
   UIWindow *window = UIApplication.sharedApplication.keyWindow;
   CGFloat bottomPadding = window.safeAreaInsets.bottom;
}

Ответ 3

Если у вас нет никакого вида, например CollectionViewLayout, вы также можете получить его из окна:

private static var itemHeight: CGFloat {
    guard #available(iOS 11.0, *),
        let window = UIApplication.shared.keyWindow else {
            return Constants.itemHeight
    }
    return Constants.itemHeight - window.safeAreaInsets.bottom
}

Ответ 4

var bottomPadding: CGFloat = 0.0
if #available(iOS 11.0, *) {
     let window = UIApplication.shared.keyWindow
     bottomPadding = window?.safeAreaInsets.bottom ?? 0.0
}

Теперь вы можете использовать bottomPadding в соответствии с вашими потребностями.

Ответ 5

используйте эту строку, чтобы стать вашим нижним значением для iPhoneX

if #available(iOS 11.0, *) {
            let bottomPadding = view.safeAreaInsets.bottom
  }

и не забудьте добавить это в layoutSubviews(), потому что safeAreaInsets имеет правильный размер в layoutSubviews(), иначе вы получите неправильные значения.

Ответ 6

iOS 11 (смесь из ответов выше)

let padding = UIApplication.shared.keyWindow?.safeAreaInsets.bottom?? 0