Получить верхнюю и нижнюю высоты вставки в безопасную область

На новом iPhone X, какой был бы самый правильный способ получить как верхнюю, так и нижнюю высоту для небезопасных областей?

enter image description here

Ответ 1

Попробуй это:

В Цель C

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

В Swift

if #available(iOS 11.0, *) {
    let window = UIApplication.shared.keyWindow
    let topPadding = window?.safeAreaInsets.top
    let bottomPadding = window?.safeAreaInsets.bottom
}

Ответ 2

Чтобы получить высоту между направляющими макетов, которые вы просто делаете

let guide = view.safeAreaLayoutGuide
let height = guide.layoutFrame.size.height

Таким образом, full frame height = 812.0, safe area height = 734.0

Ниже приведен пример, где зеленый вид имеет рамку guide.layoutFrame

enter image description here

Ответ 3

Swift 4

Прикрепить представление к привязке безопасной области с помощью ограничений можно в любой точке жизненного цикла контроллера представления, поскольку ограничения обрабатываются API автоматического размещения за кулисами. Однако для доступа к значениям этих безопасных областей для определения их высоты необходимо подождать до более позднего периода в жизненном цикле контроллера представления, в идеале viewDidLayoutSubviews().

Это подключается к любому контроллеру представления:

override func viewDidLayoutSubviews() {
    super.viewDidLayoutSubviews()

    var topSafeArea: CGFloat
    var bottomSafeArea: CGFloat

    if #available(iOS 11.0, *) {
        topSafeArea = view.safeAreaInsets.top
        bottomSafeArea = view.safeAreaInsets.bottom
    } else {
        topSafeArea = topLayoutGuide.length
        bottomSafeArea = bottomLayoutGuide.length
    }

    // safe area values are now available to use

}

Я предпочитаю этот метод, чтобы вывести его из окна, потому что именно так Apple разработала API для использования. Не ссылайтесь на посторонние объекты, такие как окно, когда все уже находится в контроллере вида. А с помощью viewDidLayoutSubviews() значения безопасной области обновляются во время изменений ориентации, viewDidLayoutSubviews() состояния двойной высоты и всех других мутаций в представлении и его безопасных областях.

Ответ 4

Ни один из других ответов здесь не работал для меня, но это сработало.

var topSafeAreaHeight: CGFloat = 0
var bottomSafeAreaHeight: CGFloat = 0

  if #available(iOS 11.0, *) {
    let window = UIApplication.shared.windows[0]
    let safeFrame = window.safeAreaLayoutGuide.layoutFrame
    topSafeAreaHeight = safeFrame.minY
    bottomSafeAreaHeight = window.frame.maxY - safeFrame.maxY
  }

Ответ 5

Я работаю со средами CocoaPods и в случае, если UIApplication.shared недоступен, тогда я использую safeAreaInsets в window просмотра:

if #available(iOS 11.0, *) {
    let insets = view.window?.safeAreaInsets
    let top = insets.top
    let bottom = insets.bottom
}

Ответ 6

Objective-C У кого была проблема, когда keyWindow равно nil. Просто поместите код выше в viewDidAppear (не в viewDidLoad)

Ответ 7

safeAreaLayoutGuide Когда вид отображается на экране, это руководство отражает часть вида, которая не покрыта панелями навигации, панелями вкладок, панелями инструментов и другими видами предков. (В tvOS безопасная область отражает область, не покрытую рамкой экрана.) Если вид в настоящее время не установлен в иерархии видов или еще не виден на экране, края направляющих макета равны краям вида.

Затем, чтобы получить высоту красной стрелки на скриншоте, это:

self.safeAreaLayoutGuide.layoutFrame.size.height

Ответ 8

UIWindow *window = [[[UIApplication sharedApplication] delegate] window]; 
CGFloat fBottomPadding = window.safeAreaInsets.bottom;