textField开始编辑和结束编辑后占位文字颜色的设置

需求:一般会要求设置点击开始编辑后占位文字的颜色

理论指导:

1.一旦见到控件上的点击事件,马上想到监听,一见到监听,马上想到让代理对象或者target对象去监听,一见到代理对象,马上想到在非控件类中去设置代理,控件类中是不允许自己设置自己为代理的,如:self.delegate = self 代理产生背景就是由于自己不想做的事情交给别人来做,在自己类中自己监听自己只能用addTarget去做

2.textField上有两个事件,点击开始编辑和点击其他地方结束编辑,addTarget是解决这样的事件最好的方法

3.textField是继承于UIControl,可以用addTarget

解决方法:

1.设置富文本颜色属性

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

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

NSMutableDictionary *attrs = [NSMutableDictionary dictionary];

attrs[NSForegroundColorAttributeName] = [UIColor lightGrayColor];

self.attributedPlaceholder = [[NSAttributedString alloc] initWithString:self.placeholder attributes:attrs];

2.拿到占位文字label,直接设置它的color

由于占位文字label是textField的私有属性,所以正常是拿不到的,只能借助于kvc

根据成员变量名获取到该控件对象

UILabel *placeHolderLabel = [self valueForKey:@"placeHolderLabel"];

placeHolderLabel.textColor = [UIColor whiteColor];

注意:尽管这样使用比较简单,但是我还是倾向于使用第一种方法

封装:

由于testField没有直接提供placeHolderColor属性,而我们为了仿照系统控件其它属性可以这样直接点出来,所以进行一个封装,封装到哪里呢?这就要进行分析,这个属性是不是所有的textField控件都要使用,如果都要使用,那么封装到分类中

1.先在.h中声明属性,分类中的属性不会形成set和get实现,只会生成声明

@property UIColor *placeHolderColor;

2.在.m中实现set和get方法

-(void)setPlaceHolderColor:(UIColor *)placeHolderColor

{

NSMutableDictionary *attrs = [NSMutableDictionary dictionary];

attrs[NSForegroundColorAttributeName] = placeHolderColor;

self.attributedPlaceholder = [[NSAttributedString alloc] initWithString:self.placeholder attributes:attrs];

}

-(UIColor *)placeHolderColor

{

return nil;

}

你可能感兴趣的:(textField开始编辑和结束编辑后占位文字颜色的设置)