我想擁有30多個常用UIColors,所以我可以在我的應用程序中輕鬆訪問它們。我希望能夠做到這樣的事情:我應該在哪裏存儲30個以上的UIColors以便快速參考?
[self setBackgroundColor:[UIColor skyColor]];
[self setBackgroundColor:[UIColor dirtColor]];
[self setBackgroundColor:[UIColor yankeesColor]];
我該怎麼做?
謝謝!
我想擁有30多個常用UIColors,所以我可以在我的應用程序中輕鬆訪問它們。我希望能夠做到這樣的事情:我應該在哪裏存儲30個以上的UIColors以便快速參考?
[self setBackgroundColor:[UIColor skyColor]];
[self setBackgroundColor:[UIColor dirtColor]];
[self setBackgroundColor:[UIColor yankeesColor]];
我該怎麼做?
謝謝!
定義類別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
更好。
您可以添加行這樣的:
#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;
使用定義這種方式會產生難以理解的代碼,因爲預處理器僞指令掩蓋了kFirstColor的真實類型/特性等等。 @ rmaddy的方法更加冗長,但在代碼清晰度和性能方面更好。 –
@Beppe這是一種方法,它不是一個很好的方法。反對票可能表明這一點。否決票並不一定意味着答案是錯誤的,只是它不如另一個答案。就我個人而言,我覺得投票選出正確的答案會是一種更好的做法,但每個SO用戶都有自己的積分方法。 – memmons
#定義並不是一個壞方法。代碼很短(每種顏色一行),線程安全,類型安全,易於理解和修改。 #defines有些地方可能讓程序員陷入困境,但這似乎並不是其中之一。 – EricS
爲什麼使用靜態顏色變量而不是返回colorWithRed的結果:green:blue:alpha?爲後續請求加快速度?每次請求新顏色時,顏色變量是否會被覆蓋? – JeffRegan
@JeffCompton我使用了一種靜態方式,所以顏色只會被創建一次。這是次要的優化。每個靜態的範圍都與它所在的方法有關,所以它們不會互相影響。與在兩種不同方法中使用相同名稱的非靜態變量無異。 – rmaddy
備註:使用'dispatch_once()'可能是更「現代」的方式,會使初始化線程安全。 –