2013-08-04 80 views
0

我想擁有30多個常用UIColors,所以我可以在我的應用程序中輕鬆訪問它們。我希望能夠做到這樣的事情:我應該在哪裏存儲30個以上的UIColors以便快速參考?

[self setBackgroundColor:[UIColor skyColor]]; 
[self setBackgroundColor:[UIColor dirtColor]]; 
[self setBackgroundColor:[UIColor yankeesColor]]; 

我該怎麼做?

謝謝!

回答

14

定義類別UIColor

在的UIColor + MyColors.h:

@interface UIColor (MyColors) 

+ (UIColor *)skyColor; 
+ (UIColor *)dirtColor; 
// and the rest of them 

@end 

在的UIColor + MyColors.m:

@implementation UIColor (MyColors) 

+ (UIColor *)skyColor { 
    static UIColor color = nil; 
    if (!color) { 
     // replace r, g, and b with the proper values 
     color = [UIColor colorWithRed:r green:g blue:b alpha:1]; 
    } 

    return color; 
} 

+ (UIColor *)dirtColor { 
    static UIColor color = nil; 
    if (!color) { 
     // replace r, g, and b with the proper values 
     color = [UIColor colorWithRed:r green:g blue:b alpha:1]; 
    } 

    return color; 
} 

// and the rest 

@end 

編輯:

正如馬丁 - [R所指出的,更現代的方法來初始化靜態color變量爲:

+ (UIColor *)skyColor { 
    static UIColor color = nil; 
    static dispatch_once_t predicate = 0; 

    dispatch_once(&predicate, ^{ 
     // replace r, g, and b with the proper values 
     color = [UIColor colorWithRed:r green:g blue:b alpha:1]; 
    }); 

    return color; 
} 

這實際上可能是矯枉過正,在這種情況下,因爲沒有壞如果兩個線程碰巧使用原始代碼同時初始化nil靜態變量,則會產生副作用。但使用dispatch_once更好。

+0

爲什麼使用靜態顏色變量而不是返回colorWithRed的結果:green:blue:alpha?爲後續請求加快速度?每次請求新顏色時,顏色變量是否會被覆蓋? – JeffRegan

+2

@JeffCompton我使用了一種靜態方式,所以顏色只會被創建一次。這是次要的優化。每個靜態的範圍都與它所在的方法有關,所以它們不會互相影響。與在兩種不同方法中使用相同名稱的非靜態變量無異。 – rmaddy

+1

備註:使用'dispatch_once()'可能是更「現代」的方式,會使初始化線程安全。 –

1

您可以添加行這樣的:

#define kFirstColor [UIColor whiteColor] 
#define kSecondColor [UIColor colorWithRed:100.0/255 green:100.0/255 blue:100.0/255 alpha:1.0] 

在類的開始或Color.h頭添加到您的項目,並在需要時將其導入。

#import "Color.h" 

然後你可以使用你的自定義顏色是這樣的:

self.view.backgroundColor = kSecondColor; 
+6

使用定義這種方式會產生難以理解的代碼,因爲預處理器僞指令掩蓋了kFirstColor的真實類型/特性等等。 @ rmaddy的方法更加冗長,但在代碼清晰度和性能方面更好。 –

+2

@Beppe這是一種方法,它不是一個很好的方法。反對票可能表明這一點。否決票並不一定意味着答案是錯誤的,只是它不如另一個答案。就我個人而言,我覺得投票選出正確的答案會是一種更好的做法,但每個SO用戶都有自己的積分方法。 – memmons

+2

#定義並不是一個壞方法。代碼很短(每種顏色一行),線程安全,類型安全,易於理解和修改。 #defines有些地方可能讓程序員陷入困境,但這似乎並不是其中之一。 – EricS

相關問題