小编典典

检测设备是否为 iPhone X

all

我的 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 功能),还是我必须使用间接测量”

根据到目前为止给出的答案,我认为答案是“不,没有直接的方法。测量是要走的路”。


阅读 95

收藏
2022-05-05

共1个答案

小编典典

iPhone X 高度为 2436 像素

设备屏幕尺寸和分辨率

在此处输入图像描述

设备屏幕尺寸和方向

在此处输入图像描述

Swift 3 and later:

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/XS/11 Pro")

        case 2688:
            print("iPhone XS Max/11 Pro Max")

        case 1792:
            print("iPhone XR/ 11 ")

        default:
            print("Unknown")
        }
    }

Objective-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:
            case 2208:
                printf("iPhone 6+/6S+/7+/8+");
                break;

           case 2436:
                printf("iPhone X/XS/11 Pro");
                 break;

            case 2688:
                printf("iPhone XS Max/11 Pro Max");
                 break;

            case 1792:
                printf("iPhone XR/ 11 ");
                 break;

            default:
                printf("Unknown");
                break;
        }
    }

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");
    } else if ((UIScreen.MainScreen.Bounds.Height * UIScreen.MainScreen.Scale) == 1334) {
        Console.WriteLine("iPhone 6/6S/7/8");
    } else if ((UIScreen.MainScreen.Bounds.Height * UIScreen.MainScreen.Scale) == 1920 || (UIScreen.MainScreen.Bounds.Height * UIScreen.MainScreen.Scale) == 2208) {
        Console.WriteLine("iPhone 6+/6S+/7+/8+");
    } else if ((UIScreen.MainScreen.Bounds.Height * UIScreen.MainScreen.Scale) == 2436) {
        Console.WriteLine("iPhone X, XS, 11 Pro");
    } else if ((UIScreen.MainScreen.Bounds.Height * UIScreen.MainScreen.Scale) == 2688) {
        Console.WriteLine("iPhone XS Max, 11 Pro Max");
    } else if ((UIScreen.MainScreen.Bounds.Height * UIScreen.MainScreen.Scale) == 1792) {
        Console.WriteLine("iPhone XR, 11");
    } else {
        Console.WriteLine("Unknown");
    }
}

根据您的问题如下:

screenSize.height用作 float812.0f 而不是 int 812

if (UI_USER_INTERFACE_IDIOM() == UIUserInterfaceIdiomPhone) {
    CGSize screenSize = [[UIScreen mainScreen] bounds].size;
        // 812.0 on iPhone X, XS
        // 896.0 on iPhone XS Max, XR.

    if (screenSize.height >= 812.0f)
        NSLog(@"iPhone X");
    }

有关更多信息,您可以参考 iOS 人机界面指南中的以下页面:

Swift

检测topNotch

如果有人考虑使用 notch 来检测 iPhoneX,请注意在“风景”上对所有 iPhone 都是一样的。

var hasTopNotch: Bool {
    if #available(iOS 13.0,  *) {
        return UIApplication.shared.windows.filter {$0.isKeyWindow}.first?.safeAreaInsets.top ?? 0 > 20
    }else{
     return UIApplication.shared.delegate?.window??.safeAreaInsets.top ?? 0 > 20
    }

    return false
}

Objective-C

- (BOOL)hasTopNotch {
   if (@available(iOS 13.0, *)) {
       return [self keyWindow].safeAreaInsets.top > 20.0;
   }else{
       return [[[UIApplication sharedApplication] delegate] window].safeAreaInsets.top > 20.0;
   }
   return  NO;
}

- (UIWindow*)keyWindow {
    UIWindow        *foundWindow = nil;
    NSArray         *windows = [[UIApplication sharedApplication]windows];
    for (UIWindow   *window in windows) {
        if (window.isKeyWindow) {
            foundWindow = window;
            break;
        }
    }
    return foundWindow;
}

更新

不要使用该userInterfaceIdiom属性来识别设备类型,正如userInterfaceIdiom
的文档
所解释的那样:

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

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

正确的方法是通过uname. 检查以下内容以了解详细信息:

2022-05-05