iPad用のコンパイル時に設定されます、特定のXcodeのコンパイラフラグはありますか?
-
23-09-2019 - |
質問
iPad用のコンパイル時にセットを取得し、特定のXcodeのコンパイラフラグはありますか?
私は条件付きでiPhone / iPod touchのコード対のiPadをコンパイルするたとえばます:
#ifdef TARGET_IPAD
code for iPad
#else
code for iPhone
#endif
私が知っている簡単に、具体的には、iPadの?
ターゲットとすることをすでにTARGET_OS_IPHONEとTargetConditionals.hでTARGET_CPU_ARM何でもあり-Rei
解決
のiPad対iPhone / iPadのタッチのチェックは実行時に使用する正しいAPIは、次のとおりです。
BOOL deviceIsPad = ([[UIDevice currentDevice] userInterfaceIdiom] == UIUserInterfaceIdiomPad);
配備ターゲットが#define UI_USER_INTERFACE_IDIOM() ([[UIDevice currentDevice] respondsToSelector:@selector(userInterfaceIdiom)] ? [[UIDevice currentDevice] userInterfaceIdiom] : UIUserInterfaceIdiomPhone)
あなただけの言うことができるので、マイナスます:
BOOL deviceIsPad = (UI_USER_INTERFACE_IDIOM() != UIUserInterfaceIdiomPhone);
他のヒント
代わりにコンパイル時のフラグを使用して、あなたは、例えば、ランタイムチェックを使用する必要があります使用NSClassFromString
同じアプリは両方のデバイスにインストールすることができますので、クラスが存在するかどうかを確認する。
そしてので、両方のデバイスでアプリを実行しているの可能性、それはiPadのを対象とするか否かを内蔵し、コンパイル時のチェックがありません。
現在、私はあなたがiPadであるかどうかをチェックしましょうだろう何かを見つけることができませんでしたが、Appleは、ランタイムチェックを推奨していた場合、私にもわかりません。ここでは、アップルからの抜粋です:
あなたのビューコントローラに加えて、iPhoneとiPadのデバイス間で共有されているすべてのクラスは、分離株デバイス固有のコードに条件付きコンパイルのマクロを含める必要があります。あなたはまた、特定のクラスやメソッドが利用可能かどうかを決定するために実行時チェックを使用することができますが、そうすることは1つのデバイスだけ、または他に続くことはないコードパスを追加して、実行可能ファイルのサイズを増加するであろう。コンパイラは、このコードを削除まかせあなたのコードクリーナーを維持するのに役立ちます。
しかし、私は条件付きコンパイルのマクロについてより詳細な情報を見つけることができる場所がない。
同じプロジェクト/コードを共有する複数のターゲットのために、私は私のiPadのターゲットのCフラグを編集することによって、これをやってます。
アクティブなターゲットとして選択[myappに] -iPadターゲットで、プロジェクトを選ぶ - >編集アクティブなターゲット[myappに] -iPad。 「Cフラグ」とダブルクリックを検索します。 「-D TARGET_IPAD」のフラグを追加します。今のシンボルTARGET_IPADは、あなたのiPadのターゲットのために定義されます。
あなたがiPadとiPhone用に別のターゲットを使用している場合は、もちろん、これはのみ動作します。あなたは、両方に同じバイナリを実行している場合は、明らかに、コンパイラがあなたのためにできることは何もありません。 (ただし、1月の終わりのように3.2 SDKもユニバーサルはまだアプリをサポートしていません。)
(編集後は、私は、「ユニバーサル」アプリケーションなどの用語について混乱していた。)
それとも - >念のために
-(BOOL)isDeviceAniPad
{
#if __IPHONE_OS_VERSION_MIN_REQUIRED >= 30200
BOOL deviceIsPad = ([[UIDevice currentDevice] userInterfaceIdiom] == UIUserInterfaceIdiomPad);
return deviceIsPad;
#endif
return NO;
}
私はこれがそうなると思います。
-(BOOL)isDeviceAniPad
{
#if __IPHONE_OS_VERSION_MIN_REQUIRED >= 30200
return ([[UIDevice currentDevice] userInterfaceIdiom] == UIUserInterfaceIdiomPad);
#endif
return NO;
}