1

iPad と iPhone で実行できるユニバーサル アプリの開発に取り組んでいます。Apple iPad のドキュメントには、iPad と iPhone のどちらで実行しているかを確認するために使用するように書かれていますが、私たちの iPhone は 3.1.2 であり、定義されUI_USER_INTERFACE_IDIOM()ていません。UI_USER_INTERFACE_IDIOM()そのため、このコードは次のように壊れます。

//iPhone should not be flipped upside down. iPad can have any
- (BOOL)shouldAutorotateToInterfaceOrientation:(UIInterfaceOrientation)interfaceOrientation {
 if(UI_USER_INTERFACE_IDIOM() == UIUserInterfaceIdiomPad) {
  return YES; //are we on an iPad?
 } else {
  return interfaceOrientation != UIInterfaceOrientationPortraitUpsideDown;
 }
}

Apple のSDK 互換性ガイドでは、関数が存在するかどうかを確認するために次のことを行うことを提案しています。

//iPhone should not be flipped upside down. iPad can have any
- (BOOL)shouldAutorotateToInterfaceOrientation:(UIInterfaceOrientation)interfaceOrientation {
 if(UI_USER_INTERFACE_IDIOM() != NULL &&
  UI_USER_INTERFACE_IDIOM() == UIUserInterfaceIdiomPad) {
  return YES; //are we on an iPad?
 } else {
  return interfaceOrientation != UIInterfaceOrientationPortraitUpsideDown;
 }
}

これは機能しますが、「ポインタと整数の比較」というコンパイラ警告が表示されます。掘り下げた後、次のようにキャストすることでコンパイラの警告を消すことができることがわかりました(void *)

//iPhone should not be flipped upside down. iPad can have any
- (BOOL)shouldAutorotateToInterfaceOrientation:(UIInterfaceOrientation)interfaceOrientation {
 if((void *)UI_USER_INTERFACE_IDIOM() != NULL &&
  UI_USER_INTERFACE_IDIOM() == UIUserInterfaceIdiomPad) {
  return YES; //are we on an iPad?
 } else {
  return interfaceOrientation != UIInterfaceOrientationPortraitUpsideDown;
 }
}

私の質問はこれです: ここの最後のコードブロックは大丈夫ですか/許容できる/標準的な慣行ですか? クイック検索でこのようなことをしている人を他に見つけることができなかったので、落とし穴や似たようなことを見逃したのではないかと思いました.

ありがとう。

4

1 に答える 1

6

3.2 SDK に対して iPad 用のアプリをビルドする必要があります。そのため、正しくビルドされ、UI_USER_INTERFACE_IDIOM() マクロは引き続き機能します。方法/理由を知りたい場合は、ドキュメントで調べてください。これは #define であり、コンパイラによって理解され、3.1 (など) で正しく実行されるコードにコンパイルされます。

于 2010-04-16T16:05:26.107 に答える