改变UITextField占位文字颜色的两种方法

在开发中,我们许多时候要改变文本框的占位颜色,毕竟默认颜色有点丑而且在点亮非点亮状态颜色也不一样的时候,视觉效果更好,这就需要我们提供方便快捷的修改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  //需要包含此头文件
    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 

@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"];
}

你可能感兴趣的