最近項(xiàng)目中碰到UI給出的切圖中咏瑟,大部分Label的文本顏色都是 16進(jìn)制顏色#23b6bc,但是UILabel 控件默認(rèn)好像都是黑色還是什么顏色來(lái)著病蛉。當(dāng)時(shí)是想到了兩種解決方案。
1.自定義一個(gè)UILabel子類(lèi)称勋,在子類(lèi)中設(shè)置label的通用樣式昌妹,以后就用這個(gè)子類(lèi)去實(shí)例化使用即可。
2.用runtime 可以替換類(lèi)的init方法顷扩,再替換的init方法中設(shè)置一下空間的默認(rèn)樣式。這種方法感覺(jué)實(shí)用性更好一些慰毅。隘截。。
(1)新建一個(gè)UILabel的分類(lèi)汹胃,這里我命名UILabel+DefaultTextColor?
(2)建好分類(lèi)后婶芭,在分類(lèi)的.m文件中添加替換的方法
? /**
*在這些方法中將你的字體名字換進(jìn)去
*/
- (instancetype)ZpfDefInit
{
id__self = [selfZpfDefInit];
UIColor * textColor=GetJinZhiColor(@"#444444");
self.textColor=textColor;
return__self;
}
-(instancetype)ZpfDefBaseInitWithFrame:(CGRect)rect{
id__self = [selfZpfDefBaseInitWithFrame:rect];
UIColor * textColor=GetJinZhiColor(@"#444444");
self.textColor=textColor;
return__self;
}
-(void)ZpfDefBaseAwakeFromNib{
[selfZpfDefBaseAwakeFromNib];
UIColor * textColor=GetJinZhiColor(@"#444444");
self.textColor=textColor;
}
這三個(gè)方法分別用來(lái)替換init , initWithFrame , xib初始化方法统台。這樣使用的時(shí)候無(wú)論用哪個(gè)方法初始化都能夠設(shè)置自定義的樣式雕擂。
(3)最重要的方法,復(fù)寫(xiě)類(lèi)方法+(void)load ,這個(gè)方法是當(dāng)類(lèi)被加載時(shí)候調(diào)用的贱勃,在這個(gè)方法里進(jìn)行需要的方法替換即可井赌。
+(void)load{
//只執(zhí)行一次這個(gè)方法
staticdispatch_once_t onceToken;
dispatch_once(&onceToken, ^{
Class class = [selfclass];
// When swizzling a class method, use the following:
// Class class = object_getClass((id)self);
//替換三個(gè)方法
SELoriginalSelector =@selector(init);
SELoriginalSelector2 =@selector(initWithFrame:);
SELoriginalSelector3 =@selector(awakeFromNib);
SELswizzledSelector =@selector(ZpfDefInit);
SELswizzledSelector2 =@selector(ZpfDefBaseInitWithFrame:);
SELswizzledSelector3 =@selector(ZpfDefBaseAwakeFromNib);
Method originalMethod = class_getInstanceMethod(class, originalSelector);
Method originalMethod2 = class_getInstanceMethod(class, originalSelector2);
Method originalMethod3 = class_getInstanceMethod(class, originalSelector3);
Method swizzledMethod = class_getInstanceMethod(class, swizzledSelector);
Method swizzledMethod2 = class_getInstanceMethod(class, swizzledSelector2);
Method swizzledMethod3 = class_getInstanceMethod(class, swizzledSelector3);
BOOLdidAddMethod =
class_addMethod(class,
originalSelector,
method_getImplementation(swizzledMethod),
method_getTypeEncoding(swizzledMethod));
BOOLdidAddMethod2 =
class_addMethod(class,
originalSelector2,
method_getImplementation(swizzledMethod2),
method_getTypeEncoding(swizzledMethod2));
BOOLdidAddMethod3 =
class_addMethod(class,
originalSelector3,
method_getImplementation(swizzledMethod3),
method_getTypeEncoding(swizzledMethod3));
if(didAddMethod) {
class_replaceMethod(class,
swizzledSelector,
method_getImplementation(originalMethod),
method_getTypeEncoding(originalMethod));
}else{
method_exchangeImplementations(originalMethod, swizzledMethod);
}
if(didAddMethod2) {
class_replaceMethod(class,
swizzledSelector2,
method_getImplementation(originalMethod2),
method_getTypeEncoding(originalMethod2));
}else{
method_exchangeImplementations(originalMethod2, swizzledMethod2);
}
if(didAddMethod3) {
class_replaceMethod(class,
swizzledSelector3,
method_getImplementation(originalMethod3),
method_getTypeEncoding(originalMethod3));
}else{
method_exchangeImplementations(originalMethod3, swizzledMethod3);
}
});
}
(4)完成以上三步后,在appdelegate.m中引用分類(lèi)的頭文件 #import"UILabel+DefaultTextColor.h"
替換完以后贵扰,就能一勞永逸的設(shè)置通用的label樣式仇穗,而不需每次都調(diào)用label.textcolor方法去設(shè)置文本顏色,同理所有UIKit的控件戚绕,或是需要設(shè)置通用屬性的時(shí)候用這個(gè)方法就能達(dá)到效果