如何检测设备(iPhone)是否有物理home键?

15

如何在 Swift 中检测当前设备 (iPhone) 是否有物理 home 按钮,比如: iPhone X,iPhone Xs,iPhone Xs Max,iPhone Xr?


1
没有主页按钮 == 安全区域 > 0 返回 true - Kerberos
6
好的,我会尽力以通俗易懂的方式翻译以下内容:“出于好奇,你为什么想知道一个设备是否有主页按钮?” - rmaddy
1
可能是这个问题的重复:iOS:检测设备是否为iPhone X系列(无边框) - Cristik
1
额外的高度来自安全区域。因此,您不需要知道设备的类型。只需添加安全区域即可。 - rmaddy
2
这就是我最初评论的重点。在大多数情况下,当有人想要检测特定设备(或设备类型)时,他们都是错误的。最好将问题集中在您正在尝试解决的实际任务上。 - rmaddy
显示剩余10条评论
3个回答

35

检查安全区域:

if @available(iOS 11.0, *), 
    UIApplication.sharedApplication.keyWindow?.safeAreaInsets.bottom > 0 {
    return true
}
return false

Swift 4.2 版本:

var isBottom: Bool {
    if #available(iOS 11.0, *), let keyWindow = UIApplication.shared.keyWindow, keyWindow.safeAreaInsets.bottom > 0 {
        return true
    }
    return false
}

你也可以检查设备类型(查看这个帖子),但检查安全区域可能是最简单的方法。


4
Swift 4.2: return true } return false``` 如果 iOS 版本高于等于 11.0,且当前应用程序有主窗口(`keyWindow`)且底部安全区域的值大于 0,则返回 `true`。否则返回 `false`。 - Adam Waite
我需要尽早知道按钮是否存在,因为我的布局取决于它,但在我查询它时keyWindow为空。还有其他方法可以了解按钮的存在吗? - jho

4

iOS 13及以上版本:

    var isBottom: Bool {
    if #available(iOS 13.0, *), UIApplication.shared.windows[0].safeAreaInsets.bottom > 0 {
        return true
    }
    return false
}

苹果手机如果有硬件Home键,可以安装iOS> = 13,因此我认为这是不正确的。 - jho

-1

iOS版本 >= 13.0

UIApplication.shared.windowsiOS 15.0中已被弃用,我们可以用以下方式替代:

    var hasHomeButton: Bool {
        let window = UIApplication
            .shared
            .connectedScenes
            .compactMap { $0 as? UIWindowScene }
            .flatMap { $0.windows }
            .first { $0.isKeyWindow }
        guard let safeAreaBottom =  window?.safeAreaInsets.bottom else {
            return false
        }
        return safeAreaBottom <= 0
    }

在SwiftUI中,你也可以使用这个变量,但不要在你的SwiftUI视图结构的init()方法中使用它。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接