iPhone X将对象底部对齐到安全区域废墟在其他设备上查找

000*_*010 15 iphone ios autolayout iphone-x

关于iPhone X Autolayout怪癖的问题.

我有两个按钮,以前这些按钮会与超视图对齐,偏移量为20,不会让它们触及屏幕底部(我已经将链接更改为安全区域而非Superview).

这是原始设置: iPhone 8  - 设置

在较旧的iPhone上看起来不错. iPhone 8 20偏移

现在,底部约束的20常量使得按钮看起来很时髦,并且距离iPhone X上的主页栏太远了. iPhone X 20 Offset

从逻辑上讲,我需要从iPhone X上的约束中删除20常量,并使按钮直接与安全区域的底部对齐. iPhone X  - 设置

现在在iPhone X上看起来不错. iPhone X 0偏移

但现在它将按钮放在非家用酒吧电话的屏幕底部附近. iPhone 8 0偏移

我在Apple文档中遗漏了这个问题的直接解决方案吗?无法使用大小类,因为在这种情况下,iPhone X大小类与其他iPhone重叠.

我可以很容易地编码来检测iPhone X并将约束上的常量设置为0,但我希望有一个更优雅的解决方案.

谢谢,

Jus*_*her 9

Apple Docs声称iOS 11中有一个新的声明可以解决这个问题.目前iPhone X和iPhone 8共享相同的大小类,因此我们必须提出另一种解决方案.

var additionalSafeAreaInsets:UIEdgeInsets {get set}

在AppDelegate中添加以下代码,rootViewController的所有子代将继承额外的安全区域.以下示例屏幕截图描述了此行为.

func application(_ application: UIApplication, didFinishLaunchingWithOptions launchOptions: [UIApplicationLaunchOptionsKey: Any]?) -> Bool {
    // Override point for customization after application launch.

    if !self.isIphoneX() {
        self.window?.rootViewController?.additionalSafeAreaInsets = UIEdgeInsets(top: 0, left: 0, bottom: 20, right: 0)
    }

    return true
}

func isIphoneX() -> Bool {
    if #available(iOS 11.0, *) {
        if ((self.window?.safeAreaInsets.top)! > CGFloat(0.0)) {
            return true;
        }
    }
    return false
}
Run Code Online (Sandbox Code Playgroud)

iPhone X Interface Builder与安全区域对齐

在此输入图像描述

iPhone 8 Interface Builder与安全区域对齐

在此输入图像描述

iPhone X模拟器 - 主屏幕

在此输入图像描述

iPhone X模拟器 - 详细信息屏幕

在此输入图像描述

iPhone 8模拟器 - 主屏幕

在此输入图像描述

iPhone 8模拟器 - 详细信息屏幕

在此输入图像描述


Mar*_*lli 8

直接从情节提要中实现此效果的另一种方法是创建两个约束:
1.在元素和安全区域之间,优先级为0的优先级
为250。2.在元素和超级视图底部之间,优先级为750且常数为20的greater Than or Equal关系。

在此处输入图片说明