在开发中,我们许多时候要改变文本框的占位颜色,毕竟默认颜色有点丑😁而且在点亮非点亮状态颜色也不一样的时候,视觉效果更好,这就需要我们提供方便快捷的修改UITextField的占位文字颜色方法,下面我介绍自己比较熟悉的几种方法,并在最后提供个人开发中的小细节和技巧
1.富文本属性
// 创建字典描述富文本
NSMutableDictionary *attr = [NSMutableDictionary dictionary];
attr[NSForegroundColorAttributeName] = placeholderColor;
// 创建富文本字符串
NSAttributedString *attrStr = [[NSAttributedString alloc] initWithString:self.placeholder attributes:attr];
// 设置富文本属性占位文字
self.attributedPlaceholder = attrStr;
2.利用Runtime获取私有的属性名称,利用KVC设置属性
UILabel *label = [self valueForKeyPath:@"placeholderLabel"];
label.textColor = placeholderColor;
//两种方法等价
// [self setValue:placeholderColor forKeyPath:@"_placeholderLabel.textColor"];
关于通过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可以获取该私有属性,还可以通过断点调试,获得该属性
使用中的细节和技巧
我在开发中是将该方法写在UITextField的分类中,并通过property生成placeholderColor的setter,getter方法,这样我们在开发中就可以通过点语法调用该方法,更加方便.头文件代码如下:
#import <UIKit/UIKit.h>
@interface UITextField (Placeholder)
@property UIColor *placeholderColor;
//- (void)setPlaceholderColor:(UIColor *)placeholderColor; 使用property生成方法,并通过点语法调用
@end
使用中有一个细节,就是在上面方法中进行优化,提高扩展性,以为如果我们在viewdidload方法中,先设置placeholderColor,在设置占位文字是无效的,也就说该方法扩展性不够好,因此,通过优化,最终的代码如下:
- (void)setPlaceholderColor:(UIColor *)placeholderColor
{
// 需要注意的是此优化,放在富文本属性中无效
if (self.placeholder.length == 0) {
self.placeholder = @" ";
}
[self setValue:placeholderColor forKeyPath:@"_placeholderLabel.textColor"];
}