美文网首页iOS学习笔记iOS Developer
怎样设置文本框的光标和占位文字的颜色,且方法的复用性强?

怎样设置文本框的光标和占位文字的颜色,且方法的复用性强?

作者: 飞舞的指尖 | 来源:发表于2016-04-17 03:01 被阅读292次


需求:我要先鼠标选中文本编辑框光标和占位文字的颜色都发生改变,不选中就回复原来的灰色.

这里介绍一个可以方便复用的简单方法

runtime 实时机制中有:交换方法和给分类添加属性的功能.

交换方法适用场景:系统自带的方法功能不够,给系统自带的方法扩展一些功能,并且保持原有的功能。

给分类添加属性的功能原理:给一个类声明属性,其实本质就是给这个类添加关联,并不是直接把这个值的内存空间添加到类存空间。

分析:

1.拿不到占位符控件(Placeholder)去设置占位符文字颜色(PlaceholderColor),怎么办?

思路:把设置的占位文字颜色和设置的占位符起来,等调用方法要设置的时候再去设置占位文字的颜色;把这个存放颜色和占位符的属性保存到UITextField(文本框的父类中),这里就需要用到runtime.

2.怎样设置颜色呢?

当系统调用placeholder这个方法的时候实现颜色设置,发现系统的placeholder没有我要设置颜色和占位符的方法,唯有通过自定义写一个placeholder添加placeholderColor属性设置方法再和系统的placeholder方法交换.

代码:

1.写个分类实现添加属性(placeholderColor)和方法交换(这个复用性很好)

<1>程序启动的时候加载

+(void)load

{//需要交换的方法

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

//自定义的方法

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

//方法交换,我调用系统的 setPlaceholder 方法也相当于调用了set_Placeholder的方法

method_exchangeImplementations(setPlaceholderMethod, setZJWPlaceholderMethod);

}

<2>自定义方法的实现

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

//设置占位符

[selfseting_Placeholder:placeholder];

//设置占位文字颜色

[selfsetPlaceholderColor:self.placeholderColor];

}

<3>设置占位文字颜色

- (void)setPlaceholderColor:(UIColor*)placeholderColor

{

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

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

// 等真正设置占位文字的时候,在去设置占位文字颜色,获取占位文字控件

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

//拿到控件去设置颜色

placeholderLabel.textColor= placeholderColor;

}

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

- (UIColor*)placeholderColor

{

returnobjc_getAssociatedObject(self,@"placeholderColor");

}

@end


2.在对应设定UITextField状态的文件中调用方法实现(通过target方式)

-(void)awakeFromNib

{

//设置光标的颜色

self.tintColor= [UIColor blueColor];

//监听文本框开始编辑1.代理,2.target ,3.通知

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

//结束监听

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

}

//结束编辑时占位文字的颜色

-(void)textEnd{

self.placeholderColor= [UIColor lightGrayColor];

}

//设置开始编辑时占位文字的颜色

-(void)textBegin{

self.placeholderColor= [UIColor blueColor];

}

@end

以上代码中抽取了分类,也就是说APP 内全局的的UITextField文本都可以设置,有较强的复用性,可移植性.

- (void)setXmg_Placeholder:(NSString*)placeholder

{

//设置占位符控件

[selfsetXmg_Placeholder:placeholder];

//设置占位文字颜色

[selfsetPlaceholderColor:self.placeholderColor];

}

//设置占位文字颜色

- (void)setPlaceholderColor:(UIColor*)placeholderColor

{

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

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

// 2.等真正设置占位文字的时候,在去设置占位文字颜色

//获取占位文字控件

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

//拿到控件去设置颜色

placeholderLabel.textColor= placeholderColor;

}

//返回添加属性placeholderColor,占位文字颜色

相关文章

网友评论

本文标题:怎样设置文本框的光标和占位文字的颜色,且方法的复用性强?

本文链接:https://www.haomeiwen.com/subject/rljolttx.html