web-dev-qa-db-ja.com

プログラムでiPad / iPhoneハードウェアを検出する最良の方法

私が知る必要があるのは、iPadでは、UIPickerViewの横向きの高さが縦向きと同じだからです。 iPhoneでは異なります。 iPadプログラミングガイドでは、UIDeviceに「イディオム」値を導入しています。

    UIDevice* thisDevice = [UIDevice currentDevice];
    if(thisDevice.userInterfaceIdiom == UIUserInterfaceIdiomPad)
    {
        // iPad
    }
    else
    {
        // iPhone
    }

iPad(3.2)では動作しますが、iPhone(3.1.3)では動作しません-そのため、次のように、条件付きでチェックをコンパイルするにはifdefが必要なようです:

#if __IPHONE_OS_VERSION_MIN_REQUIRED >= 30200
        UIDevice* thisDevice = [UIDevice currentDevice];
        if(thisDevice.userInterfaceIdiom == UIUserInterfaceIdiomPad)
        {
            // etc.
        }
#endif

私にはそれが非常に不器用に見え始めています。より良い方法は何ですか?

46
Adam Eberbach

Appleの現在のドキュメント(iOS 8.1、2015)によると、既存の回答の多くは非常に古く、実際に最も多くの賛成票が間違っているように見えるため、私は今(そしてこの晩期に)回答しています。

私の主張を証明するために、これはApplesヘッダーファイルからのコメントです(常にAppleソースとヘッダーを見てください):

/*The UI_USER_INTERFACE_IDIOM() macro is provided for use when
  deploying to a version of the iOS less than 3.2. If the earliest
  version of iPhone/iOS that you will be deploying for is 3.2 or
  greater, you may use -[UIDevice userInterfaceIdiom] directly.*/

したがって、現在Apple推奨 iPhoneとiPadを検出する方法は次のとおりです。

1)iOSのバージョン[〜#〜] prior [〜#〜] to 3.2では、Apple提供されたマクロを使用します。

// for iPhone use UIUserInterfaceIdiomPhone
if(UI_USER_INTERFACE_IDIOM() == UIUserInterfaceIdiomPad)

2)iOS 3.2以降のバージョンでは、[UIDevice currentDevice]のプロパティを使用します。

// for iPhone use UIUserInterfaceIdiomPhone
if([UIDevice currentDevice].userInterfaceIdiom == UIUserInterfaceIdiomPad)
26
Cliff Ribaudo

実行時のチェック(最初の方法)は、コンパイル時の#ifとはまったく異なります。プリプロセッサディレクティブは、ユニバーサルアプリを提供しません。

望ましい方法は、Appleのマクロを使用することです。

if (UI_USER_INTERFACE_IDIOM() == UIUserInterfaceIdiomPad)
{
     // The device is an iPad running iPhone 3.2 or later.
}
else
{
     // The device is an iPhone or iPod touch.
}

3.2をベースSDKとして使用します(マクロは3.2より前に定義されていないため)。以前のOSバージョンをターゲットにして、iPhoneで実行できます。

63
Eiko

isPad() 関数が好きです。同じコードですが、見えない場所に1か所で保管してください。

17
progrmr

私のソリューション(3.2以上で動作します):

#define IS_IPHONE (!IS_IPAD)
#define IS_IPAD (UI_USER_INTERFACE_IDIOM() != UIUserInterfaceIdiomPhone)

その後、

if (IS_IPAD)
    // do something

または

if (IS_IPHONE)
    // do something else
15
lewisanderson

In Swift use serInterfaceIdiom instance property as-

if UIDevice.current.userInterfaceIdiom == .phone {
     print("iPhone")
 }

&その他のデバイスの場合-

  switch UIDevice.current.userInterfaceIdiom {
    case .pad:
        print("iPad")
    case .phone:
        print("iPhone")
    case .tv:
        print("TV")
    case .carPlay:
        print("carPlay")
    default: break;
  }
1
Jack

後方互換性のない機能を使用している場合、私にとって最適な方法は、プリコンパイル済みヘッダーに#defineを作成することです。例:

#if __IPHONE_OS_VERSION_MAX_ALLOWED > __IPHONE_3_2
#define USING_4_X
#endif

次に、コードでこれを実行できます。

BOOL exists = NO;
#ifdef USING_4_X        
exists = [SomeObject someMethod:[url lastPathComponent]];
#else
exists = [SomeObject someMethod:[[url path] lastPathComponent]];
#endif
0
Damon

[[[UIApplication sharedApplication] delegate] isPad]を使用してどこでも呼び出すことができるように、このメソッドをアプリデリゲートに配置します。

-(BOOL)isPad
{
    BOOL isPad;
    NSRange range = [[[UIDevice currentDevice] model] rangeOfString:@"iPad"];
    if(range.location==NSNotFound)
    {
        isPad=NO;


    }
    else {
        isPad=YES;
    }

    return isPad;
}
0
Sanniv

1-既にアプリをデバイスにインストールしている場合、2-そのビルド設定を「ユニバーサル」アプリに変更し、3-既存のアプリの上にアプリをインストールする(以前のアプリを削除せずに) )

IPhone/iPadを検出するためにここで提供されているソリューションが機能しない場合があります。まず、iPad/iPhone専用のアプリを削除し、デバイスに新しくインストールします。

0
Topsakal
BOOL isIpad()
{
    if (UI_USER_INTERFACE_IDIOM() == UIUserInterfaceIdiomPad) {
        return YES;
    }
    return NO;
}
0
andyqee