检测设备是否为iPhone X

我的iOS应用程序使用UINavigationBar的自定义高度,这会导致新的iPhone X出现一些问题。

如果某个应用程序在iPhone X上运行,是否有人已经知道如何以编程方式可靠地检测(在Objective-C中)?

编辑:

当然,检查屏幕的大小是可能的,但是,我想知道是否有像TARGET_OS_IPHONE这样的“内置”方法来检测iOS ...

if (UI_USER_INTERFACE_IDIOM() == UIUserInterfaceIdiomPhone) {
    CGSize screenSize = [[UIScreen mainScreen] bounds].size;
    if (screenSize.height == 812)
        NSLog(@"iPhone X");
}

编辑2:

我不认为,我的问题是链接问题的重复。 当然,有些方法可以“测量”当前设备的不同属性,并使用结果来决定使用哪个设备。 但是,这并不是我的问题的实际问题,因为我在第一次编辑时试图强调这一点。

实际的问题是: “是否可以直接检测当前设备是否为iPhone X(例如通过某种SDK功能)还是必须使用间接测量”

根据迄今给出的答案,我假设答案是“不,没有直接的方法,测量是要走的路”。


根据你的问题,答案是否定的,没有直接的方法,更多的信息你可以从here1和here2获得信息

如果你想检测iPhone X的高度使用2436px

设备屏幕大小和方向

在这里输入图像描述

迅速3以上

if UIDevice().userInterfaceIdiom == .phone {
        switch UIScreen.main.nativeBounds.height {
        case 1136:
            print("iPhone 5 or 5S or 5C")
        case 1334:
            print("iPhone 6/6S/7/8")
        case 1920, 2208:
            print("iPhone 6+/6S+/7+/8+")
        case 2436:
            print("iPhone X")
        default:
            print("unknown")
        }
    }

目标C

    if([[UIDevice currentDevice]userInterfaceIdiom]==UIUserInterfaceIdiomPhone) {

        switch ((int)[[UIScreen mainScreen] nativeBounds].size.height) {

            case 1136:
                printf("iPhone 5 or 5S or 5C");
                break;
            case 1334:
                printf("iPhone 6/6S/7/8");
                break;
            case 1920, 2208:
                printf("iPhone 6+/6S+/7+/8+");
                break;
            case 2436:
                printf("iPhone X");
                break;
            default:
                printf("unknown");
        }
    }

Xamarin.iOS

if(UIDevice.CurrentDevice.UserInterfaceIdiom == UIUserInterfaceIdiom.Phone)
{
       if ((UIScreen.MainScreen.Bounds.Height * UIScreen.MainScreen.Scale) == 1136)
       {
              Console.WriteLine("iPhone 5 or 5S or 5C");
       }    
       //etc...
}

基于你的问题如下

或者使用screenSize.height作为float 812.0f而不是int 812

if (UI_USER_INTERFACE_IDIOM() == UIUserInterfaceIdiomPhone) {
    CGSize screenSize = [[UIScreen mainScreen] bounds].size;
    if (screenSize.height == 812.0f)
        NSLog(@"iPhone X");
}

欲了解更多信息,你可以在这里

UPDATE

不要使用userInterfaceIdiom属性来标识设备类型,正如苹果文档解释的那样,

对于通用应用程序,您可以使用此属性来调整应用程序对特定类型设备的行为。 例如,iPhone和iPad设备具有不同的屏幕尺寸,因此您可能希望根据当前设备的类型创建不同的视图和控件。

也就是说,该属性仅用于识别正在运行的应用程序的视图样式。 但是,iPhone应用程序(不是通用的)可以通过App store安装在iPad设备上,在这种情况下,userInterfaceIdiom也会返回UIUserInterfaceIdiomPhone。

正确的方法是通过uname获取机器名称,请查看该主题以了解详细信息。


另一种可能性,目前正在起作用,因为iPhone X是唯一一个在顶部有缺口的人。 这是我真正在这里检测到的:

    BOOL iPhoneX = NO;
    if (@available(iOS 11.0, *)) {
        UIWindow *mainWindow = [[[UIApplication sharedApplication] delegate] window];
        if (mainWindow.safeAreaInsets.top > 0.0) {
            iPhoneX = YES;
        }
    }

当然,如果您处于横向方向,则可能需要检查左侧和右侧安全区域的插页。

编辑:_window是AppDelegate的UIWindow,其中此检查在应用程序didFinishLaunchingWithOptions中完成。


您可以按照维度来检测iPhone X设备。

迅速

if UIDevice().userInterfaceIdiom == .phone && UIScreen.main.nativeBounds.height == 2436 {
   //iPhone X
}

目标 - C

if ([UIDevice currentDevice].userInterfaceIdiom == UIUserInterfaceIdiomPhone && UIScreen.mainScreen.nativeBounds.size.height == 2436)  {
  //iPhone X     
}

在这里输入图像描述

但是

这是不够的方式。 如果苹果公布下一款具有相同尺寸的iPhone X的iPhone,那么最好的方法是使用硬件字符串来检测设备。

对于较新的设备硬件字符串如下。

iPhone 8 - iPhone10,1iPhone 10,4

iPhone 8 Plus - iPhone10,2iPhone 10,5

iPhone X - iPhone10,3iPhone10,6

链接地址: http://www.djcxy.com/p/19239.html

上一篇: Detect if the device is iPhone X

下一篇: valueforkey when object property is readonly and Calculated(derived)