デバイスがiPhone Xかどうかを検出する 質問する

デバイスがiPhone Xかどうかを検出する 質問する

私の iOS アプリはカスタムの高さを使用しているため、UINavigationBar新しい iPhone X でいくつかの問題が発生します。

アプリが iPhone X 上で実行されているかどうかをプログラムで (Objective-C で)確実に検出する方法をすでに知っている人はいますか?

編集:

もちろん画面のサイズを確認することは可能ですが、TARGET_OS_IPHONEiOS を検出するような「組み込み」の方法があるのだろうか...

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

編集2:

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

実際の質問は、「現在のデバイスが iPhone X であるかどうかを直接検出することは可能ですか (たとえば、何らかの SDK 機能によって)、それとも間接的な測定を使用する必要がありますか? 」です。

これまでの回答から、答えは「いいえ、直接的な方法はありません。測定が最善の方法です」であると私は推測します。

ベストアンサー1

ご質問の内容から判断すると、答えは「いいえ」です。直接的な方法はありません。詳細については、次のリンクを参照してください。

そして

iPhone Xの高さは2436ピクセルです

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

ここに画像の説明を入力してください

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

ここに画像の説明を入力してください

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");
    }
}

あなたの質問に基づいて、次のようになります:

または、int ではなくscreenSize.heightfloat として使用します。812.0f812

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 ヒューマン インターフェイス ガイドラインの次のページを参照してください。

スウィフト

検出方法topNotch:

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
}

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

おすすめ記事