【问题标题】:iPhone simulator (detect different device simulators)iPhone模拟器(检测不同的设备模拟器)
【发布时间】:2018-03-09 17:13:30
【问题描述】:

随着即将发布的 iPhone X,我希望能够为 iPhone X 显示不同的 UI 布局(由于圆角和底线,这有点像 Home 键的替代品)。

我正在使用以下 nuget 包来检索模型信息: https://github.com/dannycabrera/Get-iOS-Model

它工作得非常好,但所有不同的模拟器(iPhone 7、8、X)都只能作为模拟器出现。

有没有办法在我的 Xamarin 移动应用程序的代码中区分不同的 iPhone 模拟器?

非常感谢, 尼克

【问题讨论】:

    标签: ios xamarin xamarin.ios ios-simulator


    【解决方案1】:

    由于模拟器是一种奇怪的动物,因此在 iOS 版本的其他测试和物理设备上 FaceID 的可用性之后,屏幕尺寸与任何其他测试一样好:

    public bool iPhoneX()
    {
        var version = new Version(ObjCRuntime.Constants.Version);
        if (version < new Version(11, 0))
            return false;
        if (ObjCRuntime.Runtime.Arch == ObjCRuntime.Arch.DEVICE)
        {
            using (var context = new LocalAuthentication.LAContext())
            {
                if (context.BiometryType == LABiometryType.TypeFaceId)
                    return true;
            }
            return false;
        }
        if (UIScreen.MainScreen.PreferredMode.Size.Height == 2436)
            return true;
        return false;
    }
    

    或用于重复(绑定)调用的优化属性:

    static bool? iPhoneX;
    public bool isPhoneX
    {
        get
        {
            if (iPhoneX == null)
            {
                if (new Version(ObjCRuntime.Constants.Version) < new Version(11, 0))
                    iPhoneX = false;
                else
                {
                    if (ObjCRuntime.Runtime.Arch == ObjCRuntime.Arch.DEVICE)
                    {
                        using (var context = new LocalAuthentication.LAContext())
                        {
                            iPhoneX = context.BiometryType == LABiometryType.TypeFaceId;
                        }
                    }
                    else
                        iPhoneX = UIScreen.MainScreen.PreferredMode.Size.Height == 2436;
                }
            }
            return (bool)iPhoneX;
        }
    }
    

    【讨论】:

    • @user2118781 谢谢,我在我正在构建的原型中添加了缓存的属性版本,因为我在 UITableView 中绑定了该属性(有点像滚动演示,将元素撞开在横向模式下从缺口)
    • 虽然这确实“有效”,但我建议在大多数情况下不要这样做。这是引入微妙(或不那么微妙)错误并在未来硬件上引入兼容性问题的好方法。在一般情况下,依赖模型标识符或硬编码特定的屏幕尺寸是自找麻烦。
    • @russbishop 如果您查看逻辑失败,则仅当设备是“模拟器”时才使用屏幕尺寸来确定它是否是iPhoneX 模拟器,如果是实际设备,则使用硬件功能。
    • 我知道,我只是想警告人们不要使用屏幕尺寸检查等,因为 大多数 使用它是个坏主意。请注意,您可以使用 ProcessInfo().environment["SIMULATOR_MODEL_IDENTIFIER"] 获得实际的模型标识符,对于 iPhoneX 模拟器,它始终为 iPhone10,3 ......在大多数情况下(尽管不是全部)这也是一个坏主意。大多数时候人们应该使用安全区域布局指南,因为这对于当前和未来的硬件都是正确的。
    【解决方案2】:

    您应该简单地使用Safe Area Layout Guide,它将自动增加 iPhone X 的顶部/底部边距。

    【讨论】:

    • 感谢 ekscrypto,但无论如何;有没有办法区分 iPhone 8 和 iPhone X 模拟器?除了按屏幕尺寸/分辨率去吗?谢谢
    【解决方案3】:

    正如其他人指出的那样,您绝对应该使用Safe Area Layout Guide

    如果您真的需要检测模型,请查找 SIMULATOR_MODEL_IDENTIFIER 环境变量。 iPhone X 将返回iPhone10,3

    let model = ProcessInfo().environment["SIMULATOR_MODEL_IDENTIFIER"]

    【讨论】:

      猜你喜欢
      • 2010-09-27
      • 2011-05-01
      • 1970-01-01
      • 2013-05-24
      • 2011-10-20
      • 1970-01-01
      • 1970-01-01
      • 2011-08-02
      • 2011-11-27
      相关资源
      最近更新 更多