在開發(fā)中,我們許多時候要改變文本框的占位顏色,畢竟默認(rèn)顏色有點丑??而且在點亮非點亮狀態(tài)顏色也不一樣的時候,視覺效果更好,這就需要我們提供方便快捷的修改UITextField的占位文字顏色方法,下面我介紹自己比較熟悉的幾種方法,并在最后提供個人開發(fā)中的小細(xì)節(jié)和技巧
1.富文本屬性
// 創(chuàng)建字典描述富文本
NSMutableDictionary *attr = [NSMutableDictionary dictionary];
attr[NSForegroundColorAttributeName] = placeholderColor;
// 創(chuàng)建富文本字符串
NSAttributedString *attrStr = [[NSAttributedString alloc] initWithString:self.placeholder attributes:attr];
// 設(shè)置富文本屬性占位文字
self.attributedPlaceholder = attrStr;
2.利用Runtime獲取私有的屬性名稱,利用KVC設(shè)置屬性
UILabel *label = [self valueForKeyPath:@"placeholderLabel"];
label.textColor = placeholderColor;
//兩種方法等價
// [self setValue:placeholderColor forKeyPath:@"_placeholderLabel.textColor"];
關(guān)于通過runtime獲得此屬性代碼如下:
#import <objc/message.h> //需要包含此頭文件
unsigned int count = 0;
Ivar *ivars = class_copyIvarList([UITextField class], &count);
for (int i = 0; i < count; i++) {
Ivar ivar = ivars[i];
NSLog(@"%s----%s", ivar_getName(ivar), ivar_getTypeEncoding(ivar));
}
// 其實除了runtime可以獲取該私有屬性,還可以通過斷點調(diào)試,獲得該屬性
使用中的細(xì)節(jié)和技巧
我在開發(fā)中是將該方法寫在UITextField的分類中,并通過property生成placeholderColor的setter,getter方法,這樣我們在開發(fā)中就可以通過點語法調(diào)用該方法,更加方便.頭文件代碼如下:
#import <UIKit/UIKit.h>
@interface UITextField (Placeholder)
@property UIColor *placeholderColor;
//- (void)setPlaceholderColor:(UIColor *)placeholderColor; 使用property生成方法,并通過點語法調(diào)用
@end
使用中有一個細(xì)節(jié),就是在上面方法中進(jìn)行優(yōu)化,提高擴展性,以為如果我們在viewdidload方法中,先設(shè)置placeholderColor,在設(shè)置占位文字是無效的,也就說該方法擴展性不夠好,因此,通過優(yōu)化,最終的代碼如下:
- (void)setPlaceholderColor:(UIColor *)placeholderColor
{
// 需要注意的是此優(yōu)化,放在富文本屬性中無效
if (self.placeholder.length == 0) {
self.placeholder = @" ";
}
[self setValue:placeholderColor forKeyPath:@"_placeholderLabel.textColor"];
}