美文网首页
更改UITextFiled中placeholder的颜色

更改UITextFiled中placeholder的颜色

作者: 面糊 | 来源:发表于2016-05-27 19:04 被阅读131次
    1. 对placeholder的分析

      1. 随意创建一个UITextFiled, 然后通过打断点的方式, 在调试区查看TextFiled的内部属性(通常用这种方法偷看苹果隐藏起来的属性)

        • 通过对属性的排查, 我们发现placeholder本质上就是一个UILabel, 这个隐藏的变量名称为_placeholderLabel
        • 而对于一个UILable, 我们都知道应该怎样修改他的字体颜色, 但是别忘了这个属性是水果隐藏起来的, 私有API, 正常情况下是不会让我们访问到的
        • 因此我们就要使用苹果的黑魔法之一: KVC
      2. KVC作为苹果的黑魔法之一, 平时最大的用处就是用来给变量赋值, 并且最nb的地方就在于他能访问到隐藏起来的私有变量: 来重温一下setValue: forKeyPath:的实现流程

        • 首先, 他会根据你所提供的Key, 去方法调用对象的内部, 需找是否有Key对应的setter方法, 如果有就直接调用方法给这个Key附上Value的值
        • 如果没有setter方法, 就会查找有没有与Key名称相同的变量, 如果找到了, 就直接给这个变量赋值
        • 如果没有找到Key的同名变量, 那么就会继续查找有没有与Key同名, 但是带下划线的成员变量, 即_Key, 如果找到了, 就直接赋值
        • 如果此时还是没有找到的话, KVC就会调用setValue: forUndefinedKey:这个方法, 然后抛出异常, 程序崩溃
        • 这里有一个小技巧, 我们经常使用字典数组给模型赋值, 然后转化为模型数组, 但是从服务器返回的所有数据, 我们并不需要每一个, 往往只是需要其中几个, 而这时使用KVC往往会出现问题, 这时我们可以重写setValue: forUndefinedKey这个方法但是不写任何实现, 这样我们就成功的干掉了系统的方法, 不让他再给我们抛出异常, 但强烈建议, 不要随便干掉系统的方法, 除非你知道自己在干什么
    2. 使用KVC来修改placeholder的颜色

      1. 一行代码搞定placeholder的颜色, 利用KVC来访问他的私有变量

        [self setValue:[UIColor lightGrayColor] forKeyPath:@"_placeholderLabel.textColor"];

      2. 如果你想在UITextFiled编辑时, 编辑完成时展现不同的颜色, 就需要给TextFiled添加监听方法

        • UITextFiled属于UIControl的子类, 也就是说他可以使用[]addTarget: action: forControlEvent]这个方法来增加监听方法

        • 监听开始编辑: UIControlEventEditingDidBegin

        • 监听编辑结束: UIControlEventEditingDidEnd

        • 为上面两个监听事件分别绑定不同的方法, 然后再使用KVC更改placeholder的颜色即可

            - (void)awakeFromNib { // 默认情况下的颜色
                
                [self setValue:[UIColor lightGrayColor] forKeyPath:@"_placeholderLabel.textColor"];
                
                [self addTarget:self action:@selector(textBeginEdit) forControlEvents:UIControlEventEditingDidBegin];
                [self addTarget:self action:@selector(textEndEdit) forControlEvents:UIControlEventEditingDidEnd];
            }
            
            - (void)textBeginEdit { // 开始编辑时的颜色
                
                [self setValue:[UIColor whiteColor] forKeyPath:@"_placeholderLabel.textColor"];
            }
            
            - (void)textEndEdit { // 结束编辑时的颜色
                
                [self setValue:[UIColor lightGrayColor] forKeyPath:@"_placeholderLabel.textColor"];
            }

    相关文章

      网友评论

          本文标题:更改UITextFiled中placeholder的颜色

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