Дополнительное нижнее пространство/прокладка на 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
    }
}

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


person standousset    schedule 15.09.2017    source источник
comment
см. это для ссылки: medium.com/@hacknicity/   -  person Anbu.Karthik    schedule 15.09.2017
comment
посмотрите на это, может быть полезно medium.com/the-traveled-ios-developers-guide/   -  person Gagan_iOS    schedule 15.09.2017


Ответы (7)


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

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

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

person Paolo    schedule 15.09.2017

В Objective-C

if (@available(iOS 11.0, *)) {
   UIWindow *window = UIApplication.sharedApplication.keyWindow;
   CGFloat bottomPadding = window.safeAreaInsets.bottom;
}
person user6788419    schedule 19.10.2017
comment
ДА! view.safeAreaInsets.bottom вернул 0, ваша подсказка вернула правильно: 34. - person Thomás Pereira; 17.01.2019
comment
Я вторю другому пользователю. ДА! view.safeAreaInsets.bottom вернул 0, ваш совет вернул правильно: 34. применимо и ко мне. - person Josh Wolff; 05.06.2020
comment
Это полезно, когда вы хотите получить настоящую нижнюю безопасную зону. Если там есть панель вкладок, то я обнаружил, что vc.view.safeAreaInsets.bottom включает высоту панели вкладок, что имеет смысл. Но я хотел, чтобы мой настраиваемый лист действий закрывал панель инструментов, но не доходил до самого низа. Так что это дает мне номер, который мне нужен. - person Andy Weinstein; 15.09.2020

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

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

person Hemang    schedule 20.11.2018

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

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
}
person Azon    schedule 18.10.2017

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

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

person Merricat    schedule 30.04.2019

UIApplication.shared.windows.first?.safeAreaInsets.bottom ?? 0.0

iOS 13 и выше

person user10447655    schedule 11.02.2020
comment
Это должно быть выше, так как keyWindow обесценивается с iOS 13. - person thecoolwinter; 17.10.2020

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

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

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

person Osman    schedule 28.07.2018