2012-02-22 3 views
3

Я пытаюсь изменить существующую библиотеку для работы с iPhone и iPad. Есть несколько утверждений, которые я хотел бы изменить:Можно указать, если инструкции #define?

#define width 320 
#define height 50 

Я хотел бы сделать что-то вроде:

if([[UIDevice currentDevice] userInterfaceIdiom] == UIUserInterfaceIdiomPhone){ 
    #define width X 
    #define height Y } 
else { 
    #define width A 
    #define height B 
} 

Однако, кажется, я не могу это сделать. Есть ли способ достичь чего-то подобного? Благодаря

ответ

-1

Как о чем-то вроде этого:

#define widthPhone 320 
#define widthPad 400 
#define heightPhone 50 
#define heightPad 90 

if ([[UIDevice currentDevice] userInterfaceIdiom] == UIUserInterfaceIdiomPhone) { 
    width = widthPhone; 
    height = heightPhone; 
} else { 
    width = widthPad; 
    height = heightPad; 
} 
+0

Возможно, вы хотите использовать 'static const', а не '# define'. –

0

#define является определение препроцессора. Это означает, что это первое, что сделано в компиляции. Он в основном просто вставляет определение везде в коде, прежде чем он начнет компиляцию.

Но поскольку ваши операторы if выполняются во время выполнения, а не времени компиляции, вам нужно либо изменить свои операторы if на препроцессор if (#if, не рекомендуется), либо изменить ширину/высоту, определяемую во время выполнения (настоятельно рекомендуется). Это должно выглядеть так:

int width, height; 
if([[UIDevice currentDevice] userInterfaceIdiom] == UIUserInterfaceIdiomPhone){ 
    width = X; 
    height = Y; 
else { 
    width = A; 
    height = B; 
} 

и затем с этого времени просто используйте значения ширины и высоты для вашей ширины и высоты.

Если вы все еще хотите пометить X, Y, A, B, а не с помощью #define (компилировать постоянные времени), использование во время выполнения константы:

static const int iPhoneWidth = X; 
static const int iPhoneHeight = Y; 
static const int iPadWidth = A; 
static const int iPadHeight = B; 

if([[UIDevice currentDevice] userInterfaceIdiom] == UIUserInterfaceIdiomPhone){ 
    width = iPhoneWidth; 
    height = iPhoneHeight; 
else { 
    width = iPadWidth; 
    height = iPadHeight; 
} 
+0

Просьба указать причину для downvoting. –

+1

+1, потому что в этом случае настоятельно рекомендуется определять ширину/высоту во время выполнения. Вероятно, вы получили -1, потому что вы действительно не ответили на исходный вопрос: как использовать 'if' с #define. В любом случае: если он компилирует две разные цели (один для iPhone один для iPad), а не один (универсальный), то нет ничего плохого в использовании #if для определения этих свойств во время компиляции. –

0

вы можете сделать так,

#define width (([[UIDevice currentDevice] userInterfaceIdiom] != UIUserInterfaceIdiomPhone) ? A : x) 
#define height (([[UIDevice currentDevice] userInterfaceIdiom] != UIUserInterfaceIdiomPhone) ? B : Y) 
+1

Если вы используете ширину и высоту сотни раз вокруг своего приложения, компилятор собирается вставить этот уродливый код повсюду. Вы действительно должны избегать макросов, где это возможно. –

+0

@arasmussen, спасибо за ваше предложение. это будет иметь в виду. – Vignesh

2

Вы можете использовать #if:

#if TARGET_DEVICE_IPHONE // note this may be different, don't have acces to Xcode right now. 
#define width X 
#define height Y 
#else 
#define width A 
#define height B 
#endif 

Или просто сделать простые встроенные функции:

static inline int width() 
{ 
     return [[UIDevice currentDevice] userInterfaceIdiom] == UIUserInterfaceIdiomPhone ? X : A; 
} 

static inline int height() 
{ 
    return [[UIDevice currentDevice] userInterfaceIdiom] == UIUserInterfaceIdiomPhone ? Y : B; 
} 
Смежные вопросы