1. ホーム
  2. アイオス

[解決済み】デバイスがiPhone Xであるかどうかを検出します。

2022-04-03 08:28:58

質問

私のiOSアプリでは UINavigationBar を使用すると、新しい iPhone X でいくつかの問題が発生します。

どなたか既にご存知の方はいらっしゃいますか? 信頼できる アプリがiPhone Xで動作しているかどうかをプログラム的に(Objective-Cで)検出できますか?

EDITです。

もちろん、画面の大きさをチェックすることは可能ですが、次のようなビルドイン方式はないでしょうか。 TARGET_OS_IPHONE iOSを検出するために...

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

EDIT 2:

私の質問は、リンク先の質問と重複しているとは思いません。もちろん、現在のデバイスのさまざまなプロパティを測定し、その結果を使用してどのデバイスを使用するかを決定する方法は存在します。しかし、これは、私が最初の編集で強調しようとしたように、私の質問の実際のポイントではありません。

実際の質問は 現在のデバイスがiPhone Xであるかどうかを直接検出することは可能ですか(SDKの機能などによる)、それとも間接的な測定値を使用しなければなりませんか" ?

これまでの回答から推測すると、「直接的な方法はない」ということでしょう。測定が必要です"。

どのように解決するのですか?

ご質問の内容からすると、答えは「ノー」です。直接的な方法はありません。詳しくは、こちらで情報を得ることができます。

iPhone Xの縦幅は2436pxです

から デバイスの画面サイズと解像度 :

から デバイスの画面サイズと向き :

Swift 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/XS/11 Pro")
        
        case 2688:
            print("iPhone XS Max/11 Pro Max")
        
        case 1792:
            print("iPhone XR/ 11 ")
        
        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:
            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 フロートとして 812.0f not 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 Human Interface Guidelinesの以下のページを参照してください。

スウィフト :

で検出する。 topNotch :

iPhoneXを検出するためにノッチを使用することを検討している人は、quot;landscape"でそのすべての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
}

オブジェクティブ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 . 詳しくは以下をご確認ください。