我們知道直接在Storyboard中設置按鈕的背景色是不能根據不同狀態來更改的,那問題來了,如果我們需要在不同的狀態下(比如按鈕沒有被按下或者被按下),使得按鈕呈現不同的背景色怎麼辦?
比如上圖左邊是按鈕沒有被按下時的背景色,右邊是按鈕被按下時的背景色。
第一種方案
我們知道按鈕的Image屬性可以在不同的狀態下設置不同的圖片,那最直觀的辦法就是提供兩種背景色的圖片,然後直接在Storyboard上通過設置不同狀態下Image屬性的值來達到目的。
但是這種方案最不好的地方就在於需要提供很多僅僅是顏色不同的圖片,如果以後背景色改成其他色系怎麼辦?設置以後提供換膚功能,每一種皮膚都要提供一整套這些背景色圖片嗎?
第二種方案
我們還知道按鈕的BackgroundImage也是可以根據不同狀態來設置不同的背景圖片的,那方案就來了,讓程序根據顏色自動生成不同的純色背景圖片即可。
為了保證可復用性,定義一個UIButton的Category,實現如下:
@implementation UIButton (FillColor)
- (void)setBackgroundColor:(UIColor *)backgroundColor forState:(UIControlState)state {
[self setBackgroundImage:[UIButton imageWithColor:backgroundColor] forState:state];
}
+ (UIImage *)imageWithColor:(UIColor *)color {
CGRect rect = CGRectMake(0.0f, 0.0f, 1.0f, 1.0f);
UIGraphicsBeginImageContext(rect.size);
CGContextRef context = UIGraphicsGetCurrentContext();
CGContextSetFillColorWithColor(context, [color CGColor]);
CGContextFillRect(context, rect);
UIImage *image = UIGraphicsGetImageFromCurrentImageContext();
UIGraphicsEndImageContext();
return image;
}
@end
上述代碼應該還是很直觀的,調用的辦法如下:
[self.button setBackgroundColor:GetColorFromHex(0xffff9000) forState:UIControlStateNormal];
[self.button setBackgroundColor:GetColorFromHex(0xffff6c00) forState:UIControlStateHighlighted];
其中GetColorFromHex是我自己定義的一個宏:
#define GetColorFromHex(hexColor) \
[UIColor colorWithRed:((hexColor >> 16) & 0xFF) / 255.0 \
green:((hexColor >> 8) & 0xFF) / 255.0 \
blue:((hexColor >> 0) & 0xFF) / 255.0 \
alpha:((hexColor >> 24) & 0xFF) / 255.0]
其實上述宏代碼寫成Category會更好,以後再做修改了。