美文网首页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