IPhoneとiPadのどちらで実行しているかを実行時にチェックするためのAPIはありますか?
私が考えることができる1つの方法は、使用することです:
[[UIDevice currentDevice] model];
そして、文字列@ "iPad"の存在を検出します-これは少し壊れやすいようです。
3.2 SDKでは、UIDevice
にも実際に探しているプロパティがありますが、3.2以前では機能しません(明らかに)。
[[UIDevice currentDevice] userInterfaceIdiom];
ユニバーサルアプリの@ "iPad"の存在を確認する以外の方法はありますか?
チェックアウト - UI_USER_INTERFACE_IDIOM
。
現在のデバイスでサポートされているインターフェイスイディオムを返します。
戻り値
UIUserInterfaceIdiomPhone
デバイスがiPhoneまたはiPod touchの場合、またはUIUserInterfaceIdiomPad
デバイスがiPadの場合。現在のデバイスで使用する必要があるインターフェースのタイプ
typedef enum {
UIUserInterfaceIdiomPhone,
UIUserInterfaceIdiomPad,
} UIUserInterfaceIdiom;
参考までに:
@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用に作成されたオブジェクトを取得し、それらを使用して作業します。
追加
私はコード全体でこのソリューションを使用しています。標準のファクトリパターンをallocに追加します。
#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 { ALLOC_PER_DEVICE(); }
そして、電話バージョン用にTheClassPhone
というサブクラスを追加します。
注: Objective-Cには多重継承がないため、継承を使用して問題を解決するのは少し過大評価されています(つまり、サブクラスのサブクラスがある場合は機能しません)。必要なときに、良いif
のようなものはありません。
編集: ...これは明らかにUI_USER_INTERFACE_IDIOM()マクロとまったく同じなので、代わりにそれを使用します。 :)
次のコードを使用して、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;
}