Определение константы на основе 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 ответа:
Решение, на котором я остановился, было предложено Ланоркиным, который должен определить его следующим образом:
#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;