にはどうすればよい得UI_USER_INTERFACE_IDIOM()作iPhone OS SDK < 3.2
-
24-09-2019 - |
質問
Appleの助言を以下のコードを検出するかどうかを走iPadやiPhone/iPod Touch:
if (UI_USER_INTERFACE_IDIOM() == UIUserInterfaceIdiomPad) {
// The device is an iPad running iPhone 3.2 or later.
// [for example, load appropriate iPad nib file]
}
else {
// The device is an iPhone or iPod touch.
// [for example, load appropriate iPhone nib file]
}
問題はUI_USER_INTERFACE_IDIOM()およびUIUserInterfaceIdiomPad定義されていないものをもたらします。前3.2.このように完全に敗北の目的な機能です。できるだけさとは、iPhone OS3.2(iPhone OS3.2できるだけ実行されるiPad).なので使いいただけるのであればUI_USER_INTERFACE_IDIOM()の結果は常にへとを示しました。
場のニーズに合わせてさまざまなことを目的とした環境作り3.1.3(最近のiPhone/iPod Touch OS)を試すためにiPhoneを結合ユニバーサルアプリのコードを取得しますコンパイラの誤差が生じ記号に定義されていないものの3.1.3以前の時の作成のためのiPhoneをシミュレータ3.1.3.
この推奨によりアップルプランタイムデバイス-検出、なぜですか?は誰も成功したこのアプローチからデバイス-検出?
解決
私は3.1.3と3.2の両方でコンパイルするためのコードを取得するには、この操作を行います:
BOOL iPad = NO;
#ifdef UI_USER_INTERFACE_IDIOM
iPad = (UI_USER_INTERFACE_IDIOM() == UIUserInterfaceIdiomPad);
#endif
if (iPad) {
// iPad specific code here
} else {
// iPhone/iPod specific code here
}
私もここでそれについて簡単なブログ記事を書きました: のhttp:// WWW。 programbles.com/2010/04/03/compiling-conditional-code-in-universal-iphone-ipad-applications/する
他のヒント
これは私が使用するものです。
- (BOOL) amIAnIPad {
#if (__IPHONE_OS_VERSION_MAX_ALLOWED >= 30200)
if ([[UIDevice currentDevice] respondsToSelector: @selector(userInterfaceIdiom)])
return ([UIDevice currentDevice].userInterfaceIdiom == UIUserInterfaceIdiomPad);
#endif
return NO;
}
この条件付きコンパイル、あなたはまだ3.0 SIM用にビルドできるようにします。その後、チェックUIDeviceクラスはセレクタに応答するかどうかを確認します。これらのいずれかが失敗した場合、それはiPadのではありません。
この推薦によるAppleのアプローチを ランタイム デバイス-検出、なぜですか?で成功を このアプローチからデバイス-検出?
この解決のために ランタイム 検出:
#define isIPhone (![[UIDevice currentDevice] respondsToSelector:@selector(userInterfaceIdiom)] || [[UIDevice currentDevice] userInterfaceIdiom] == UIUserInterfaceIdiomPhone)
その後、簡単に試して繰り返して行なうことができるコード:
if (isIPhone) { ... }
の差を利用ポイント#/#ifdefであることは実行時検査な#場合はコンパイル時ます。
と思い、実行試験により、ご利用いただけるexactableの他のOSのバージョンです。ご利用の場合コンパイル時のチェックする必要がありまして、実行可能ファイルを異なるOSのバージョン.
場合の問題は、コンパイル時の誤差だけではコンパイルに対し最終版のSDK( どのようにアクセスの弱い連携の枠組みます。).
私は答えは単にiPhone のシミュレータの3.1.3またはそれ以前のコードを実行しようとしないんだと思います。常に3.2 SDKでコンパイルします。 iPhoneシミュレータ3.2はあなたのiPadのシミュレータを取得、またはiPhoneデバイス3.2用にコンパイルし、それをテストするために携帯電話にアプリを配置します。
3.2 SDKに対してコンパイルおよび3.1.3またはそれ以前のシミュレータを使用する方法はありません。
- (BOOL)deviceIsAnIPad {
if ([[UIDevice currentDevice] respondsToSelector:@selector(userInterfaceIdiom)])
//We can test if it's an iPad. Running iOS3.2+
if ([[UIDevice currentDevice] userInterfaceIdiom] == UIUserInterfaceIdiomPad)
return YES; //is an iPad
else
return NO; //is an iPhone
else
return NO; //does not respond to selector, therefore must be < iOS3.2, therefore is an iPhone
}
宣言
#ifdef UI_USER_INTERFACE_IDIOM
#define IS_IPAD (UI_USER_INTERFACE_IDIOM() == UIUserInterfaceIdiomPad)
#else
#define IS_IPAD false
#endif
その後、以下のようにチェックを使用する
#define DetailLabel_PosX (IS_IPAD ? 200 : 160)
一部の
iphone 5をチェックするために定義もあります#define IS_IPHONE5 (([[UIScreen mainScreen] bounds].size.height-568)?NO:YES)
#define IOS_OLDER_THAN_6 ([[[UIDevice currentDevice] systemVersion] floatValue] < 6.0 )
#define IOS_NEWER_OR_EQUAL_TO_6 ([[[UIDevice currentDevice] systemVersion] floatValue] >= 6.0 )
これは完全なA機能の目的を無効にするようです。彼ら iPhone上のみをコンパイルして実行することができます OS 3.2(iPhone OS 3.2のみ実行することができます iPad上)。だから、あなたが使用できるかどうか UI_USER_INTERFACE_IDIOM()、結果 いつものiPadを示すためになります。
これは完全に間違っています。これは、3.2のベースSDKにのコンパイルのこと、それはすることができ、の実行のいずれかのOS上で、あなたが適切なデプロイメント・ターゲットを設定します。
することができますUI_USER_INTERFACE_IDIOM()とUIUserInterfaceIdiomPadはiOS3.2上で使用することができ、上向きに、重要な部分は、「上向き」です。確かに。あなたが思うようチェックは無意味とならないようiOS3.2は、唯一のiPadが、iOS4.0用とiPhoneやiPadの両方で動作を超えてます。