Определение константы на основе BOOL


В моем приложении для iOS у меня есть константы.класс h, где я определяю kBorderWidth. Для дисплеев retina я хотел бы, чтобы это было .5 так, чтобы границы были толщиной в 1 пиксель, а на дисплеях без сетчатки я хочу, чтобы она была 1, чтобы она оставалась толщиной в один пиксель и не меньше. Вот мой код прямо сейчас:

#define IS_RETINA ([[UIScreen mainScreen] respondsToSelector:@selector(displayLinkWithTarget:selector:)] && ([UIScreen mainScreen].scale == 2.0))

#if __IS_RETINA == 1
    #define kBorderWidth .5
#else
    #define kBorderWidth 1
#endif

, который компилируется просто отлично, но приводит к тому, что kBorderWidth равен 1. Как я могу исправить это так, чтобы оно выполняло то, что я хочу?

2 2

2 ответа:

Решение, на котором я остановился, было предложено Ланоркиным, который должен определить его следующим образом:

#define kBorderWidth (1.0 / [UIScreen mainScreen].scale)

Что является будущим доказательством и просто, а также работает в пределах констант.H файл, который я уже настроил.

Ваш" #define " Макрос:

#define IS_RETINA ([[UIScreen mainScreen] respondsToSelector:@selector(displayLinkWithTarget:selector:)] && ([UIScreen mainScreen].scale == 2.0))

Определяет некоторый код, который выполняется во время выполнения, а не во время компиляции.

Вместо того, чтобы делать:

#if __IS_RETINA == 1
    #define kBorderWidth .5
#else
    #define kBorderWidth 1
#endif

Вы должны установить переменную времени выполнения, например:

static CGFloat gBorderWidth; // at the top of your .m file

Или свойство:

@property (readwrite) CGFloat borderWidth;

И затем установите его в методах viewDidLoad или viewWillAppear:

if(([[UIScreen mainScreen] respondsToSelector:@selector(displayLinkWithTarget:selector:)] && ([UIScreen mainScreen].scale == 2.0)))
{
    self.borderWidth = 0.5f;
} else {
    self.borderWidth = 1.0f;
}

Теперь, когда я понимаю, что вы хотите сделать это доступным для ряда контроллеров вида (например, потому что это было первоначально в "constants.h"), почему бы и нет создайте класс decorator singleton, который всегда существует в течение жизни вашего приложения и может управлять внешним видом вашего приложения через открытые свойства, такие как "borderWidth".

Таким образом, вы можете получить доступ к нему через что-то вроде:

 AppearanceUtilityClass *appearance = [AppearanceUtilityClass sharedInstance];
 CGFloat borderWidth = appearance.borderWidth;