Является ли макрос лучше, чем UIColor для настройки цвета RGB? - PullRequest
5 голосов
/ 07 августа 2009

У меня есть этот макрос в заголовочном файле:

#define UIColorFromRGB(rgbValue) \
        [UIColor colorWithRed:((float)((rgbValue & 0xFF0000) >> 16))/255.0 \
                        green:((float)((rgbValue & 0xFF00) >> 8))/255.0 \
                         blue:((float)(rgbValue & 0xFF))/255.0 \
                        alpha:1.0]

И я использую это как то в моем .m файле:

cell.textColor = UIColorFromRGB(0x663333);

Итак, я хочу спросить всех, это лучше или я должен использовать этот подход:

cell.textColor = [UIColor colorWithRed:66/255.0
                                 green:33/255.0
                                  blue:33/255.0
                                 alpha:1.0];

Какой подход лучше?

Ответы [ 7 ]

17 голосов
/ 09 сентября 2011

или создайте отдельную категорию, поэтому вам нужно импортировать только один файл .h:

@interface UIColor (util)
+ (UIColor *) colorWithHexString:(NSString *)hex;
+ (UIColor *) colorWithHexValue: (NSInteger) hex;
@end

и

#import "UIColor-util.h"

@implementation UIColor (util)

// Create a color using a string with a webcolor
// ex. [UIColor colorWithHexString:@"#03047F"]
+ (UIColor *) colorWithHexString:(NSString *)hexstr {
    NSScanner *scanner;
    unsigned int rgbval;

    scanner = [NSScanner scannerWithString: hexstr];
    [scanner setCharactersToBeSkipped:[NSCharacterSet characterSetWithCharactersInString:@"#"]];
    [scanner scanHexInt: &rgbval];

    return [UIColor colorWithHexValue: rgbval];
}

// Create a color using a hex RGB value
// ex. [UIColor colorWithHexValue: 0x03047F]
+ (UIColor *) colorWithHexValue: (NSInteger) rgbValue {
    return [UIColor colorWithRed:((float)((rgbValue & 0xFF0000) >> 16))/255.0
                           green:((float)((rgbValue & 0xFF00) >> 8))/255.0
                            blue:((float)(rgbValue & 0xFF))/255.0
                           alpha:1.0];

}


@end
15 голосов
/ 03 ноября 2010

Как насчет создания собственного:

#define RGB(r, g, b) \
    [UIColor colorWithRed:(r)/255.0 green:(g)/255.0 blue:(b)/255.0 alpha:1]
#define RGBA(r, g, b, a) \
    [UIColor colorWithRed:(r)/255.0 green:(g)/255.0 blue:(b)/255.0 alpha:(a)]

Тогда используйте это:

cell.textColor = RGB(0x66, 0x33, 0x33);

Кажется достаточно простым в использовании, использует шестнадцатеричные значения для цветов и не требует дополнительных затрат вычислений.

12 голосов
/ 07 августа 2009

Средний план может быть вашим лучшим вариантом. Вы можете определить обычную функцию C или target-C, чтобы делать то, что сейчас делает ваш макрос:

// As a C function:
UIColor* UIColorFromRGB(NSInteger rgbValue) {
    return [UIColor colorWithRed:((float)((rgbValue & 0xFF0000) >> 16))/255.0
                           green:((float)((rgbValue & 0xFF00) >> 8))/255.0
                            blue:((float)(rgbValue & 0xFF))/255.0
                           alpha:1.0];
}

// As an Objective-C function:
- (UIColor *)UIColorFromRGB:(NSInteger)rgbValue {
return [UIColor colorWithRed:((float)((rgbValue & 0xFF0000) >> 16))/255.0
                       green:((float)((rgbValue & 0xFF00) >> 8))/255.0
                        blue:((float)(rgbValue & 0xFF))/255.0
                       alpha:1.0];
}

Если вы решите придерживаться макроса, вы должны поставить круглые скобки вокруг rgbValue, где бы он ни появлялся. Если я решу назвать ваш макрос с:

UIColorFromRGB(0xFF0000 + 0x00CC00 + 0x000099);

у вас могут быть проблемы.

Последний бит кода, безусловно, является наиболее читабельным, но, вероятно, наименее переносимым - его нельзя просто вызвать из любой точки вашей программы.

В общем, я бы рекомендовал преобразовать ваш макрос в функцию и оставить все как есть.

1 голос
/ 07 августа 2009

Я обычно рекомендую функции, а не сложные #defines. Если встраивание имеет реальную выгоду, компилятор, как правило, сделает это за вас. #defines затрудняют отладку, особенно когда они сложны (а это так).

Но здесь нет ничего плохого в использовании функции. Единственное, что я могу сказать, это то, что вы должны использовать CGFloat, а не float, но в шестнадцатеричной записи нет ничего плохого, если вам удобнее. Если у вас их много, я могу увидеть, где использование веб-цветовой нотации может быть удобным. Но избегайте макросов.

0 голосов
/ 13 января 2011

Хороший Мариус, но для компиляции мне пришлось избавиться от круглых скобок следующим образом (в противном случае Objective C воспринимает это буквально, и вы получаете ошибку компиляции синтаксиса:

#define RGB(r,g,b) [UIColor colorWithRed:r/255.0 green:g/255.0 blue:b/255.0 alpha:1.0]
...

NSArray *palette;
...

palette = [NSArray arrayWithObjects:
             RGB(0,0,0),
             RGB(255,0,0), // red
...
0 голосов
/ 07 августа 2009

Имейте в виду, что 33! = 0x33. Первая - десятичная запись, а вторая - шестнадцатеричная. Они оба действительны, но они разные. Ваш второй вариант должен читать

cell.textColor = [UIColor colorWithRed:0x66/255.0
                             green:0x33/255.0
                              blue:0x33/255.0
                             alpha:1.0];

или

cell.textColor = [UIColor colorWithRed:102/255.0
                             green:51/255.0
                              blue:51/255.0
                             alpha:1.0];
0 голосов
/ 07 августа 2009

I.m.h.o метод UIcolor более читабелен. Я думаю, что макросы хороши, если они решают проблему; т.е. обеспечить более высокую производительность и / или читабельность кода.

Мне не ясно, в чем преимущество использования макроса в этом случае, поэтому я бы предпочел второй вариант.

...