Препроцессор-IF не работает - PullRequest
2 голосов
/ 11 августа 2011

Я пытаюсь проверить с помощью Preprocessor-Ifs, является ли устройство iPad. Если это iPad, я хочу определить что-то специфичное для устройства, но по какой-то причине я не могу проверить PP-IF, если PP-Constant имеет значение true.

Может быть, у вас есть идея?

#ifdef UI_USER_INTERFACE_IDIOM

    #define IS_IPAD (UI_USER_INTERFACE_IDIOM() == UIUserInterfaceIdiomPad)

#else

    #define IS_IPAD false

#endif



#if IS_IPAD

    #define WIDTH 768
    #define HEIGHT 1024

#else

    #define WIDTH 320
    #define HEIGHT 480

#endif

Ответы [ 4 ]

11 голосов
/ 11 августа 2011

Правила препроцессора (сюрприз, сюрприз) обрабатываются до сборки приложения.Поскольку это универсальное приложение, оно еще не знает, работает ли оно на iPad или iPhone.

Используйте это:

#ifdef UI_USER_INTERFACE_IDIOM
    #define IS_IPAD (UI_USER_INTERFACE_IDIOM() == UIUserInterfaceIdiomPad)
#else
    #define IS_IPAD false
#endif

#define WIDTH (IS_IPAD ? 768 : 320)
#define HEIGHT (IS_IPAD ? 1024 : 480)
2 голосов
/ 18 октября 2011

Это мой подход: вы можете использовать это в заголовочном файле

#define _IPAD ((__IPHONE_OS_VERSION_MAX_ALLOWED >= 30200) && (UI_USER_INTERFACE_IDIOM() == UIUserInterfaceIdiomPad))
#define GUI_TITLE_LABEL_WIDTH    (_IPAD? 220*2 : 220)
#define UI_FONT_SIZE             (_IPAD? 20 : 16)

Коротко и просто: D

0 голосов
/ 11 августа 2011

(Когда вы задаете вопрос по SO, вы должны рассказать, что вы пытались и что случилось.) В любом случае, я думаю, что вы не сможете делать то, что хотите, потому что во время компиляции компилятор не знает, на каком устройстве вы будете работать. Вы можете скомпилировать код, а затем запустить его на iPad, а на iPhone - iPod. Как препроцессор узнает, на каком устройстве вы будете работать в будущем?

0 голосов
/ 11 августа 2011

У вас есть проверка во время выполнения внутри оператора #if. Проверка препроцессора не оценивает (UI_USER_INTERFACE_IDIOM() == UIUserInterfaceIdiomPad), поэтому ширину и высоту нужно будет задавать во время выполнения, так как вы не можете определить, является ли это iPad до времени выполнения. Я также рекомендовал бы использовать 0 вместо false.

...