首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何在UIKit中检测用户设备是否具有动态孤岛?

如何在UIKit中检测用户设备是否具有动态孤岛?
EN

Stack Overflow用户
提问于 2022-10-04 11:02:15
回答 2查看 831关注 0票数 0

在我的应用程序中,我实现了pull-to-refresh特性和自定义加载图标。在IPhone中,它有动态岛,它重叠了我的加载图标。

我想检测有无动态岛的设备。如果有,我会给它增加一些顶部空间。

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2022-10-04 11:50:38

目前,据我所知,dynamic island将于2022年末包含在ActivityKit中。您可以从用于ActivityKit的此链接苹果关于它的帖子查看。苹果公司也没有提供检查设备上是否有动态岛的方法。

但有一个办法可以让你得到你想要的东西。目前,动态岛仅在iPhone 14 ProiPhone 14 Pro Max上可用。所以只需要检查一下这两个设备。

Update:多亏了类型模型的此链接iPhone 14 ProiPhone 14 Pro Max的名称模型类型是iPhone15,2iPhone15,3,所以我们只需要检查这些情况。

代码会是这样的

代码语言:javascript
复制
extension UIDevice {
    func checkIfHasDynamicIsland() -> Bool {
        if let simulatorModelIdentifier = ProcessInfo().environment["SIMULATOR_MODEL_IDENTIFIER"] {
            let nameSimulator = simulatorModelIdentifier
            return nameSimulator == "iPhone15,2" || nameSimulator == "iPhone15,3" ? true : false
        }
        
        var sysinfo = utsname()
        uname(&sysinfo) // ignore return value
        let name =  String(bytes: Data(bytes: &sysinfo.machine, count: Int(_SYS_NAMELEN)), encoding: .ascii)!.trimmingCharacters(in: .controlCharacters)
        return name == "iPhone15,2" || name == "iPhone15,3" ? true : false
    }
}

用法

代码语言:javascript
复制
let value = UIDevice().checkIfHasDynamicIsland()
print("value: ", value)
票数 -1
EN

Stack Overflow用户

发布于 2022-11-02 01:35:57

  1. 根据活动文档,我们只能检测设备是否支持Live activity,但是我们不知道设备是否有动态岛
  2. 我使用窗口safeAreaInsets值来检测动态岛。当设备方向为纵向时,safeAreaInsets.top等于59(显示缩放默认值)或51(显示缩放大文本)。
  3. 这很可能支持iPhone15 Pro/iPhone15 15 Pro Max和以后的车型。

用法:print(UIDevice.current.hasDynamicIsland)

代码语言:javascript
复制
extension UIDevice {
    
    // Get this value after sceneDidBecomeActive
    var hasDynamicIsland: Bool {
        // 1. dynamicIsland only support iPhone
        guard userInterfaceIdiom == .phone else {
            return false
        }
               
        // 2. Get key window, working after sceneDidBecomeActive
        guard let window = (UIApplication.shared.connectedScenes.compactMap { $0 as? UIWindowScene }.flatMap { $0.windows }.first { $0.isKeyWindow}) else {
            print("Do not found key window")
            return false
        }
       
        // 3.It works properly when the device orientation is portrait
        return window.safeAreaInsets.top >= 51
    }
}
票数 -1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/73946911

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档