5

# if および # define ステートメントの多くの定義を読みました。
私は読んだ方法を使用しようとしましたが、以下のコメントとしてそれを定義する行に「プリプロセッサ式の開始時に無効なトークン」というエラーのみがありました。

#import <Foundation/Foundation.h>
#import <UIKit/UIKit.h>

#define is_ipad         (UI_USER_INTERFACE_IDIOM() == UIUserInterfaceIdiomPad)
#define is_ipad_hd      ( (is_ipad == 1 && [UIScreen mainScreen].bounds.size.width > 1024 ) ? YES : NO)
#define is_iphone_hd    ([UIScreen mainScreen].bounds.size.width > 480 ? YES : NO)
#define device_width    480.0f
#define device_height   320.0f

#if (is_ipad_hd == YES) // Error here
  #define device_width       = 2048.0f
  #define device_height      = 1496.0f
#endif

簡単なチュートリアルで機能する理由と、より複雑なものを試すと、これらのことが起こります!

4

3 に答える 3

5

これらはプリプロセッサディレクティブであるため、[UIScreenmainScreen]メソッドやコンパイル時に定義される他のすべてのオブジェクトにアクセスすることはできません。

于 2012-05-28T22:57:13.180 に答える
1

マクロ評価はコンパイル時に行われます。

ただし、(UI_USER_INTERFACE_IDIOM() == UIUserInterfaceIdiomPad)or[UIScreen mainScreen]は実行時にしか解釈できません。

それ以上に、汚い仕事をするために画面サイズに頼るべきではありません。代わりに、ユーザー インターフェイスのイディオムとメイン画面のスケールに依存する必要があります。

BOOL isiPad = UI_USER_INTERFACE_IDIOM() == UIUserInterfaceIdiomPad;
BOOL isHD = [[UIScreen mainScreen] scale] == 2.0;

if (isiPad) {
  if (isHD) {
    // retina iPad
  } else {
    // non-retina iPad
  }
} else {
  if (isHD) {
    // retina iPhone/iPod touch
  } else {
    // non-retina iPhone/iPod touch
  }
}
于 2012-05-28T23:00:19.313 に答える
0

私はCプリプロセッサに精通していませんが、ここで他の人に同意します。

expression は、厳しい制限を受ける整数型の C 式です。含まれている可能性があります....ソースでここですぐに達成できるよりもはるかに優れたフォーマット

于 2012-05-28T23:02:05.667 に答える