13

iPad 用にコンパイルするときに設定される特定の Xcode コンパイラ フラグはありますか?

たとえば、条件付きでiPad対iPhone / iPod Touchコードをコンパイルしたい:

#ifdef TARGET_IPAD
   code for iPad
#else
   code for iPhone
#endif

TargetConditionals.h に TARGET_OS_IPHONE と TARGET_CPU_ARM が既にあることは知っていますが、簡単かつ具体的に iPad をターゲットにするものはありますか?

-レイ

4

6 に答える 6

16

iPad と iPhone/iPad Touch のランタイム チェックに使用する正しい API は次のとおりです。

BOOL deviceIsPad = ([[UIDevice currentDevice] userInterfaceIdiom] == UIUserInterfaceIdiomPad);

UIDevice ヘッダー ファイラーには便利なマクロ UI_USER_INTERFACE_IDIOM() も含まれており、展開ターゲットが iPhone 3.2 未満の場合に役立ちます。

#define UI_USER_INTERFACE_IDIOM() ([[UIDevice currentDevice] respondsToSelector:@selector(userInterfaceIdiom)] ? [[UIDevice currentDevice] userInterfaceIdiom] : UIUserInterfaceIdiomPhone)

したがって、次のように否定的に言うことができます。

BOOL deviceIsPad = (UI_USER_INTERFACE_IDIOM() != UIUserInterfaceIdiomPhone);
于 2010-03-22T20:33:45.227 に答える
2

コンパイル時フラグを使用する代わりに、実行時チェックを使用する必要があります。たとえばNSClassFromString、同じアプリを両方のデバイスにインストールできるため、クラスが存在するかどうかを確認するために使用します。

また、両方のデバイスでアプリを実行できる可能性があるため、iPad を対象としているかどうかをコンパイル時にチェックする機能が組み込まれていません。

于 2010-01-29T07:56:06.013 に答える
0

または->念のため

-(BOOL)isDeviceAniPad
{   
#if __IPHONE_OS_VERSION_MIN_REQUIRED >= 30200
 BOOL deviceIsPad = ([[UIDevice currentDevice] userInterfaceIdiom] == UIUserInterfaceIdiomPad);
 return deviceIsPad;
#endif
 return NO;
}
于 2010-06-09T12:26:27.517 に答える
0

現在、iPad を使用しているかどうかを確認できるものは見つかりませんでしたが、Apple がランタイム チェックを推奨しているかどうかもわかりません。以下はアップルからの抜粋です。

ビュー コントローラーに加えて、iPhone と iPad デバイス間で共有されるクラスには、デバイス固有のコードを分離するための条件付きコンパイル マクロを含める必要があります。実行時チェックを使用して特定のクラスまたはメソッドが利用可能かどうかを判断することもできますが、それを行っても、いずれかのデバイスでたどられないコード パスが追加されるため、実行可能ファイルのサイズが大きくなるだけです。コンパイラにこのコードを削除させると、コードをよりクリーンに保つことができます。

ただし、条件付きコンパイル マクロに関するより具体的な情報を見つけることができる場所はありません。

于 2010-01-29T13:21:00.510 に答える
0

同じプロジェクト/コードを共有する複数のターゲットの場合、iPad ターゲットの C フラグを編集してこれを行っています。

[myapp]-iPad ターゲットをアクティブ ターゲットとして選択し、[プロジェクト] -> [アクティブ ターゲット [myapp]-iPad の編集] を選択します。「c flags」を検索してダブルクリックします。「-D TARGET_IPAD」のフラグを追加。これで、シンボル TARGET_IPAD が iPad ターゲットに対してのみ定義されます。

もちろん、これは iPad と iPhone で別々のターゲットを使用している場合にのみ機能します。両方で同じバイナリを実行している場合、コンパイラができることは何もないことは明らかです。(ただし、1 月末時点の 3.2 SDK はまだユニバーサル アプリをサポートしていません。)

(編集済み。「ユニバーサル」アプリなどの用語について混乱していました。)

于 2010-02-01T00:03:23.540 に答える
-1

これでいけると思います

-(BOOL)isDeviceAniPad
{   
#if __IPHONE_OS_VERSION_MIN_REQUIRED >= 30200
  return ([[UIDevice currentDevice] userInterfaceIdiom] == UIUserInterfaceIdiomPad);
#endif
  return NO;
}
于 2010-04-21T06:33:28.120 に答える