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


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

3 56

3 ответа:

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

на С

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

на Свифт

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

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

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

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 хочет, чтобы мы это сделали, так как UIKit добавил Эти значения в качестве свойства самого представления (в iOS 11) для доступа.