2009-08-07 15 views
5

Tôi có macro này trong tập tin tiêu đề của tôi:Macro có tốt hơn UIColor khi thiết lập màu RGB không?

#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]

Và tôi đang sử dụng điều này như một cái gì đó như thế này trong tập tin .m tôi:

cell.textColor = UIColorFromRGB(0x663333);

Vì vậy, tôi muốn hỏi mọi người là thế này tốt hơn hoặc tôi có nên sử dụng phương pháp này không:

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

Phương pháp nào tốt hơn?

+0

giải nén một NSInte ger như thế này là kiến ​​trúc cụ thể. Bạn có thể xem xét làm cho UIColorFromRGB có 3 đối số, nhưng loại đó đánh bại mục đích của bạn. –

Trả lời

12

Mặt bằng trung bình có thể là lựa chọn tốt nhất của bạn. Bạn có thể xác định hoặc là một C thường xuyên hoặc hàm mục tiêu-C để làm những gì macro của bạn đang làm gì bây giờ:

// 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]; 
}

Nếu bạn quyết định gắn bó với vĩ mô, tuy nhiên, bạn nên đặt dấu ngoặc xung quanh rgbValue bất cứ nơi nào nó xuất hiện. Nếu tôi quyết định gọi macro của bạn bằng:

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

bạn có thể gặp rắc rối.

bit cuối cùng của mã chắc chắn là dễ đọc nhất, nhưng có lẽ ít di động nhất - bạn không thể gọi nó đơn giản từ bất cứ đâu trong chương trình của bạn.

Tất cả trong tất cả, tôi khuyên bạn nên tái cấu trúc macro của mình thành một hàm và để nó ở đó.

0

I.m.h.chế độ UIcolor dễ đọc hơn. Tôi nghĩ rằng vĩ mô là tuyệt vời nếu họ giải quyết một vấn đề; tức là cung cấp thêm hiệu suất và/hoặc mã có thể đọc được.

Điều không rõ ràng với tôi về lợi ích của việc sử dụng macro là gì trong trường hợp này, vì vậy tôi muốn có tùy chọn thứ hai.

+0

nhưng làm cách nào để vượt qua giá trị màu an toàn trên web này 33CC00 bằng phương pháp colorwithrgb –

1

Tôi thường đề xuất các hàm thay vì #defines phức tạp. Nếu nội tuyến có một lợi ích thực sự, trình biên dịch nói chung sẽ làm điều đó cho bạn. #defines làm cho việc gỡ lỗi trở nên khó khăn, đặc biệt khi chúng phức tạp (và cái này là).

Nhưng không có gì sai khi sử dụng chức năng ở đây. Nitpick duy nhất tôi muốn nói là bạn nên sử dụng CGFloat thay vì phao, nhưng không có gì sai với ký hiệu hex nếu nó thoải mái hơn cho bạn. Nếu bạn có rất nhiều trong số này, tôi có thể thấy nơi sử dụng ký hiệu màu Web có thể thuận tiện. Nhưng tránh các macro.

+0

nhưng làm cách nào để chuyển giá trị màu an toàn cho web này bằng phương pháp colorwithrgb 33CC00 –

+0

Chính xác bằng macro, bằng cách truyền "0x33CC00". Đó là một số nguyên hợp pháp, vì vậy bạn có thể chuyển nó thành một tham số. –

+0

làm cách nào để tôi vượt qua điều đó trong [UIColor colorWithRed: 66/255.0 màu xanh lá cây: 33/255.0 màu xanh lam: 33/255.0 alpha: 1.0]; Phương pháp này –

0

Hãy nhớ rằng 33! = 0x33. Chữ đầu tiên là ký hiệu thập phân và ký hiệu thứ hai là hệ thập lục phân. Cả hai đều hợp lệ, nhưng chúng khác nhau. Lựa chọn thứ hai của bạn nên đọc

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

hoặc

cell.textColor = [UIColor colorWithRed:102/255.0 
          green:51/255.0 
           blue:51/255.0 
          alpha:1.0]; 
15

Làm thế nào về việc tạo riêng của bạn:

#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)] 

Sau đó sử dụng nó:

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

vẻ đủ đơn giản để sử dụng, sử dụng giá trị hex cho màu sắc và trí thông minh hout cần thêm chi phí tính toán.

0

đẹp Marius, nhưng để biên dịch tôi phải thoát khỏi dấu ngoặc, như sau (nếu không, Objective C mất nó theo nghĩa đen và bạn nhận được một lỗi cú pháp biên soạn:

#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

Dấu ngoặc đơn thực sự khá quan trọng, bỏ nó ra sẽ làm cho các giá trị như 'RGB (100 + 100, 255, 255)' không chính xác do tác dụng phụ thay thế macro. (Rould đỏ có giá trị: 100 + 100/255.0 = 100.4) – Marius

17

hoặc tạo một danh mục riêng biệt, vì vậy bạn chỉ cần nhập một file .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 
+0

điều này cần nhiều upvotes hơn –

Các vấn đề liên quan