32

実行時にiPhoneまたはiPadのどちらで実行しているかを確認するためのAPIはありますか?

私が考えることができる1つの方法は、次を使用することです。

[[UIDevice currentDevice] model];

そして、文字列@"iPad"の存在を検出します。これは少し壊れやすいようです。

3.2 SDKでは、これにUIDeviceも私が探しているプロパティがありますが、3.2より前では機能しません(明らかに):

[[UIDevice currentDevice] userInterfaceIdiom]; 

ユニバーサルアプリの@"iPad"の存在を確認する以外の方法はありますか?

4

5 に答える 5

41

チェックアウトUI_USER_INTERFACE_IDIOM

現在のデバイスでサポートされているインターフェイスイディオムを返します。


UIUserInterfaceIdiomPhoneデバイスがiPhoneまたはiPodtouchの場合、またはデバイスがiPadの場合の戻り値UIUserInterfaceIdiomPad

UIUserInterfaceIdiom

現在のデバイスで使用する必要があるインターフェイスのタイプ

typedef enum {
   UIUserInterfaceIdiomPhone,
   UIUserInterfaceIdiomPad,
} UIUserInterfaceIdiom;
于 2010-05-21T18:08:58.010 に答える
15

参考までに:

@property (nonatomic, readonly) BOOL isPhone;

-(BOOL)isPhone {
    return (UI_USER_INTERFACE_IDIOM()==UIUserInterfaceIdiomPhone);
}

または#defineを使用します

#define IS_PHONE  (UI_USER_INTERFACE_IDIOM()==UIUserInterfaceIdiomPhone)

ただし、isPhoneコード全体を使用している場合、それは一般的に悪い習慣です。ファクトリパターンとポリモーフィズムを使用してifステートメントを封じ込めておくと、電話またはiPad用に作成されたオブジェクトを取得し、それらを操作できます。

追加した

現在、コード全体でこのソリューションを使用しています。標準のファクトリパターンを割り当てに追加します。

#define ALLOC_PER_DEVICE()  id retVal = nil; \
                        NSString *className = NSStringFromClass(self);\
                        if (IS_PHONE && ![className hasSuffix:@"Phone"]) {\
                            className = [NSString stringWithFormat:@"%@Phone", className];\
                            Class newClass = NSClassFromString(className);\
                            retVal = [newClass alloc];\
                        }\
                        if (!retVal)\
                            retVal = [super alloc];\
                        assert(retVal != nil);\
                        return retVal\

次に、私の割り当ては次のようになります。

+alloc { ALLOC_PER_DEVICE(); }

TheClassPhoneそして、電話バージョンと呼ばれるサブクラスを追加します。

注: Objective-Cには多重継承がないため、継承を使用して問題を解決することは少し過大評価されます(つまり、サブクラスのサブクラスがある場合は機能しません)。ifあなたがそれを必要とするとき、良いもののようなものはありません。

于 2012-07-23T16:21:57.973 に答える
1
  1. responsesToSelector:を使用して、userInterfaceIdiomプロパティの存在を確認します。存在しない場合は、iPadではなく3.2より前のデバイスを使用しています。
  2. userInterfaceIdiomが存在する場合は、それを使用します。

編集: ...これは明らかにUI_USER_INTERFACE_IDIOM()マクロが行うことなので、代わりにそれを使用してください。:)

于 2010-05-21T18:18:48.170 に答える
1

NSClassFromStringとiPad固有のクラスを使用します。詳細はこちら:

http://developer.apple.com/iphone/library/documentation/General/Conceptual/iPadProgrammingGuide/StartingYourProject/StartingYourProject.html#//apple_ref/doc/uid/TP40009370-CH9-SW3

于 2010-05-21T18:14:17.633 に答える
1

次のコードを使用して、iPhoneまたはiPadでアプリを実行しているかどうかを確認できます。

- (NSString *)deviceModel
{
    struct utsname systemInfo;
    uname(&systemInfo);
    return [NSString stringWithCString:systemInfo.machine encoding:NSUTF8StringEncoding];
}

- (NSString *) platformString
{
    NSString *platform = [self deviceModel];
    if ([platform isEqualToString:@"iPhone1,1"])    return @"iPhone_2G";
    else if ([platform isEqualToString:@"iPhone1,2"])    return @"iPhone_3G";
    else if ([platform isEqualToString:@"iPhone2,1"])    return @"iPhone_3GS";
    else if ([platform isEqualToString:@"iPhone3,1"])    return @"iPhone_4";
    else if ([platform isEqualToString:@"iPhone3,3"])    return @"Verizon_iPhone_4";
    else if ([platform isEqualToString:@"iPhone4,1"])    return @"iPhone_4S";
    else if ([platform isEqualToString:@"iPhone5,1"])    return @"iPhone_5";
    else if ([platform isEqualToString:@"iPhone5,2"])    return @"iPhone_5";
    else if ([platform isEqualToString:@"iPod1,1"])      return @"iPod_Touch 1G";
    else if ([platform isEqualToString:@"iPod2,1"])      return @"iPod_Touch 2G";
    else if ([platform isEqualToString:@"iPod3,1"])      return @"iPod_Touch 3G";
    else if ([platform isEqualToString:@"iPod4,1"])      return @"iPod_Touch 4G";
    else if ([platform isEqualToString:@"iPad1,1"])           return @"iPad_1G";
    else if ([platform isEqualToString:@"iPad2,1"])      return @"iPad_2(WiFi)";
    else if ([platform isEqualToString:@"iPad2,2"])      return @"iPad_2(GSM)";
    else if ([platform isEqualToString:@"iPad2,3"])      return @"iPad_2(CDMA)";
    else if ([platform isEqualToString:@"iPad3,1"])      return @"iPad_3";
    else if ([platform isEqualToString:@"iPad3,2"])      return @"iPad_3(GSM/CDMA)";
    else if ([platform isEqualToString:@"iPad3,3"])      return @"iPad_3(GSM)";
    else if ([platform isEqualToString:@"iPad3,4"])      return @"iPad_3(GSM)";
    else if ([platform isEqualToString:@"iPad2,5"])      return @"iPad_mini_1G";
    else if ([platform isEqualToString:@"i386"])         return @"Simulator";
    else if ([platform isEqualToString:@"x86_64"])       return @"Simulator";
    return platform;
}
于 2012-11-09T13:19:20.147 に答える