怎樣設(shè)置文本框的光標(biāo)和占位文字的顏色,且方法的復(fù)用性強(qiáng)?


需求:我要先鼠標(biāo)選中文本編輯框光標(biāo)和占位文字的顏色都發(fā)生改變,不選中就回復(fù)原來的灰色.

這里介紹一個(gè)可以方便復(fù)用的簡單方法

runtime 實(shí)時(shí)機(jī)制中有:交換方法和給分類添加屬性的功能.

交換方法適用場景:系統(tǒng)自帶的方法功能不夠,給系統(tǒng)自帶的方法擴(kuò)展一些功能,并且保持原有的功能。

給分類添加屬性的功能原理:給一個(gè)類聲明屬性,其實(shí)本質(zhì)就是給這個(gè)類添加關(guān)聯(lián),并不是直接把這個(gè)值的內(nèi)存空間添加到類存空間。

分析:

1.拿不到占位符控件(Placeholder)去設(shè)置占位符文字顏色(PlaceholderColor),怎么辦?

思路:把設(shè)置的占位文字顏色和設(shè)置的占位符起來,等調(diào)用方法要設(shè)置的時(shí)候再去設(shè)置占位文字的顏色;把這個(gè)存放顏色和占位符的屬性保存到UITextField(文本框的父類中),這里就需要用到runtime.

2.怎樣設(shè)置顏色呢?

當(dāng)系統(tǒng)調(diào)用placeholder這個(gè)方法的時(shí)候?qū)崿F(xiàn)顏色設(shè)置,發(fā)現(xiàn)系統(tǒng)的placeholder沒有我要設(shè)置顏色和占位符的方法,唯有通過自定義寫一個(gè)placeholder添加placeholderColor屬性設(shè)置方法再和系統(tǒng)的placeholder方法交換.

代碼:

1.寫個(gè)分類實(shí)現(xiàn)添加屬性(placeholderColor)和方法交換(這個(gè)復(fù)用性很好)

<1>程序啟動(dòng)的時(shí)候加載

+(void)load

{//需要交換的方法

Method setPlaceholderMethod = class_getInstanceMethod(self,@selector(setPlaceholder:)) ;

//自定義的方法

Method setZJWPlaceholderMethod = class_getInstanceMethod(self,@selector(set_Placeholder:));

//方法交換,我調(diào)用系統(tǒng)的 setPlaceholder 方法也相當(dāng)于調(diào)用了set_Placeholder的方法

method_exchangeImplementations(setPlaceholderMethod, setZJWPlaceholderMethod);

}

<2>自定義方法的實(shí)現(xiàn)

-(void)seting_Placeholder:(UIColor*)placeholder{

//設(shè)置占位符

[selfseting_Placeholder:placeholder];

//設(shè)置占位文字顏色

[selfsetPlaceholderColor:self.placeholderColor];

}

<3>設(shè)置占位文字顏色

- (void)setPlaceholderColor:(UIColor*)placeholderColor

{

// 把占位文字顏色先保存

objc_setAssociatedObject(self,@"placeholderColor",placeholderColor,OBJC_ASSOCIATION_RETAIN_NONATOMIC);

// 等真正設(shè)置占位文字的時(shí)候,在去設(shè)置占位文字顏色,獲取占位文字控件

UILabel*placeholderLabel = [selfvalueForKey:@"placeholderLabel"];

//拿到控件去設(shè)置顏色

placeholderLabel.textColor= placeholderColor;

}

<4>返回已添加屬性placeholderColor,占位文字顏色

- (UIColor*)placeholderColor

{

returnobjc_getAssociatedObject(self,@"placeholderColor");

}

@end


2.在對應(yīng)設(shè)定UITextField狀態(tài)的文件中調(diào)用方法實(shí)現(xiàn)(通過target方式)

-(void)awakeFromNib

{

//設(shè)置光標(biāo)的顏色

self.tintColor= [UIColor blueColor];

//監(jiān)聽文本框開始編輯1.代理,2.target ,3.通知

[self addTarget:self action:@selector(textBegin)forControlEvents:UIControlEventEditingDidBegin];

//結(jié)束監(jiān)聽

[self addTarget:self action:@selector(textEnd)forControlEvents:UIControlEventEditingDidEnd];

}

//結(jié)束編輯時(shí)占位文字的顏色

-(void)textEnd{

self.placeholderColor= [UIColor lightGrayColor];

}

//設(shè)置開始編輯時(shí)占位文字的顏色

-(void)textBegin{

self.placeholderColor= [UIColor blueColor];

}

@end

以上代碼中抽取了分類,也就是說APP 內(nèi)全局的的UITextField文本都可以設(shè)置,有較強(qiáng)的復(fù)用性,可移植性.















- (void)setXmg_Placeholder:(NSString*)placeholder

{

//設(shè)置占位符控件

[selfsetXmg_Placeholder:placeholder];

//設(shè)置占位文字顏色

[selfsetPlaceholderColor:self.placeholderColor];

}

//設(shè)置占位文字顏色

- (void)setPlaceholderColor:(UIColor*)placeholderColor

{

// 1.把占位文字顏色先保存

objc_setAssociatedObject(self,@"placeholderColor", placeholderColor,OBJC_ASSOCIATION_RETAIN_NONATOMIC);

// 2.等真正設(shè)置占位文字的時(shí)候,在去設(shè)置占位文字顏色

//獲取占位文字控件

UILabel*placeholderLabel = [selfvalueForKey:@"placeholderLabel"];

//拿到控件去設(shè)置顏色

placeholderLabel.textColor= placeholderColor;

}

//返回添加屬性placeholderColor,占位文字顏色

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容