iOS应用程序在不使用iOS 11 API的情况下尊重iPhone X屏幕限制

问题描述 投票:0回答:1

我有一个需要在iOS9 - 11和X以外的iPhone上运行的应用程序。我用XCode 9构建它以便它获得完整的iPhone X屏幕,但我似乎无法正确显示它缺口。我的应用程序使用自定义UI视图,该视图在视图的边界内绘制(全屏视图)。它目前正处于下方。我想做的是,它的行为与iOS9 + iPhone 5+一样,但是在X上画一个全屏幕背景,但只使用远离缺口的区域与用户交互。这包括纵向时的顶部以及手机处于横向时的侧面。我基本上想扩展我的插图以允许在凹槽下方的边距,因此用户按钮不会像目前那样被遮挡。我尝试过safeLayoutBounds,但似乎只能通过iOS11 API访问它。

为了重申,我想使用空间进行背景使用,但是使用scoot控件等远离缺口。所以我想知道:1 - 屏幕尺寸(我已经拥有),2 - 缺口在那里 - 我假设我只通过手机型号和方向告诉,3 - 缺口覆盖的界限是什么所以我可以避免它。

如果不清楚,这里有两个屏幕截图来说明。对不起,我尝试将它们调整得更小:

景观缺口覆盖按钮Landscape notch covers buttons肖像它覆盖显示Portrait it covers the display

ios iphone swift custom-controls iphone-x
1个回答
1
投票

好的,首先 - 也许最重要的是,为什么除了iOS 11之外,任何iPhone X都应该运行? (提示:需要降级。)

话虽如此,诀窍是(a)检查正在运行的iOS版本然后(b)了解iOS 11中引入的其他内容 - 即安全区域。

因为我需要知道这个安全区域的更精确尺寸,所以我添加了一个不可见的最低级别视图。我想你可以拿我的代码,看看如何将它应用到你的需求:

let safeAreaView = UIView()
....
safeAreaView.backgroundColor = UIColor.clear
safeAreaView.translatesAutoresizingMaskIntoConstraints = false
view.addSubview(safeAreaView)
....
view.sendSubview(toBack: safeAreaView)

和布局:

let margins = view.layoutMarginsGuide
view.addLayoutGuide(margins)

if #available(iOS 11, *) {
    let guide = view.safeAreaLayoutGuide
    safeAreaView.topAnchor.constraintEqualToSystemSpacingBelow(guide.topAnchor, multiplier: 1.0).isActive = true
    safeAreaView.bottomAnchor.constraintEqualToSystemSpacingBelow(guide.bottomAnchor, multiplier: 1.0).isActive = true
} else {
    safeAreaView.topAnchor.constraint(equalTo: topLayoutGuide.bottomAnchor).isActive = true
    safeAreaView.bottomAnchor.constraint(equalTo: bottomLayoutGuide.topAnchor).isActive = true
}
safeAreaView.leadingAnchor.constraint(equalTo: view.leadingAnchor).isActive = true
safeAreaView.trailingAnchor.constraint(equalTo: view.trailingAnchor).isActive = true

净结果?您有一个视图,您可以基于剩余的布局。是的,它给出了不在“安全”区域的斑点。改变backgroundColor看看我的意思。

我确信有更好的方法可以确定(a)这个safeView的实际高度,或者(b)确定某些东西。但这适用于iOS 11,iOS 10,iPhone X,iPhone SE。

更多,它适用于AutoLayout。

© www.soinside.com 2019 - 2024. All rights reserved.