玩转iOS中UITextField的placeholder颜色

ieyong 3年前
   <p style="text-align:center"><img src="https://simg.open-open.com/show/9478bbe6c4e9f164cf8586c354b22f17.png"></p>    <p style="text-align:center">珍惜时间</p>    <p>UITextField 是iOS开发中经常使用到的控件,它有一个 placeholder 属性,也就是占位文字。默认占位文字颜色是 70% gray ,但有时我们可能需要修改其占位文字的颜色,下文中将为大家介绍三中修改方法,并就动态改变颜色做相关说明(关于动态改变:当UITextField为第一响应者时为一种颜色,取消第一响应者时为另一种颜色)。</p>    <h2><strong>方法1</strong></h2>    <ul>     <li>设置 attributedPlaceholder 属性</li>     <li>说明:此种方式对于无需动态改变 placeholder 颜色较为方便。</li>    </ul>    <ul>     <li>代码1(单色) <pre>  <code class="language-objectivec">NSMutableDictionary *attrs = [NSMutableDictionary dictionary]; // 创建属性字典  attrs[NSFontAttributeName] = [UIFont systemFontOfSize:17]; // 设置font  attrs[NSForegroundColorAttributeName] = [UIColor greenColor]; // 设置颜色  NSAttributedString *attStr = [[NSAttributedString alloc] initWithString:@"夏虫不可以语冰" attributes:attrs]; // 初始化富文本占位字符串  self.textField.attributedPlaceholder = attStr;</code></pre> </li>     <li> <p>效果1</p> <img src="https://simg.open-open.com/show/b5803d02be4c0c5727b72bbdf707a5b4.png"> <p style="text-align:center">单色placeholder</p> </li>     <li> <p>代码2(复色)</p> <pre>  <code class="language-objectivec">NSMutableAttributedString *attStr = [[NSMutableAttributedString alloc] initWithString:@"夏虫不可以语冰"];  [attStr setAttributes:@{NSForegroundColorAttributeName : [UIColor redColor],                            NSFontAttributeName : [UIFont systemFontOfSize:15.0]} range:NSMakeRange(0, 2)];  [attStr setAttributes:@{NSForegroundColorAttributeName : [UIColor greenColor],                            NSFontAttributeName : [UIFont systemFontOfSize:17.0]} range:NSMakeRange(2, 3)];  [attStr setAttributes:@{NSForegroundColorAttributeName : [UIColor blueColor],                            NSFontAttributeName : [UIFont systemFontOfSize:15.0]} range:NSMakeRange(5, 2)];    self.textField.attributedPlaceholder = attStr;</code></pre> </li>     <li>效果<br> <img src="https://simg.open-open.com/show/583b848175956bb72c93703295c1be26.png"> <p style="text-align:center">复色placeholder</p> </li>    </ul>    <h2><strong>方法2</strong></h2>    <ul>     <li>自定义UITextField,重写 - (void)drawPlaceholderInRect:(CGRect)rect;</li>     <li>说明:此种方式只能设置一次状态,不能动态的改变 placeholder 的颜色,但可以设置 placeholder 所在位置。</li>    </ul>    <ul>     <li>代码</li>    </ul>    <pre>  <code class="language-objectivec">- (void)drawPlaceholderInRect:(CGRect)rect  {      [self.placeholder drawInRect:CGRectMake(0, 2, rect.size.width, 25) withAttributes:@{ NSFontAttributeName: [UIFont systemFontOfSize:16.0],                                          NSForegroundColorAttributeName : [UIColor blueColor],                                       }];  }</code></pre>    <ul>     <li>效果<br> <img src="https://simg.open-open.com/show/78ecb13058dda67649c9b345fbfcec51.png"> <p style="text-align:center">placeholder</p> <h2><strong>方法3</strong></h2> </li>     <li>自定义UITextField,利用runTime找出UITextFiled内部隐藏的成员变量和属性,利用KVC进行修改。</li>     <li>说明:此种方式对于动态改变 placeholder 颜色较为方便。</li>    </ul>    <ul>     <li><strong>拓展代码</strong> (利用runTime找出成员变量和属性,程序中无需使用,只是帮助我们看清UITextField内部结构,知道其中的相关成员变量和属性,然后赋值即可)。</li>    </ul>    <pre>  <code class="language-objectivec">#import "SJTextField.h"  #import <objc/runtime.h>  @implementation SJTextField    // 初始化调用一次 用于查看UITextField中的成员属性和变量  + (void)initialize  {      [self getIvars];      // [self getProperties];  }    // 获取所有属性  + (void)getProperties  {      unsigned int count = 0;      objc_property_t *properties = class_copyPropertyList([UITextField class], &count);      for (int i = 0; i<count; i++) {          // 取出属性          objc_property_t property = properties[i];            // 打印属性名字          NSLog(@"%s<---->%s", property_getName(property), property_getAttributes(property));      }      free(properties);  }    // 获取所有成员变量  + (void)getIvars  {      unsigned int count = 0;      // 拷贝出所有的成员变量列表      Ivar *ivars = class_copyIvarList([UITextField class], &count);      for (int i = 0; i<count; i++) {          // 取出成员变量          //        Ivar ivar = *(ivars + i);          Ivar ivar = ivars[i];            // 打印成员变量名字          NSLog(@"%s %s", ivar_getName(ivar), ivar_getTypeEncoding(ivar));      }      // 释放      free(ivars);  }  @end</code></pre>    <ul>     <li><strong>拓展点</strong> 可以查到有两个关于 placeholder 的属性和变量,分别是 _placeholderLabel.textColor 和 _placeholderLabel ,故下面就是用来设置动态改变 placeholder 颜色的代码。</li>     <li>代码(在自定义UITextField中)</li>    </ul>    <pre>  <code class="language-objectivec">#import "SJTextField.h"  #import <objc/runtime.h>  @implementation SJTextField  static NSString * const SJPlacerholderColorKeyPath = @"_placeholderLabel.textColor";  - (void)awakeFromNib  {  // 设置placeholder开始颜色(方式一)  //    UILabel *placeholderLabel = [self valueForKeyPath:@"_placeholderLabel"];  //    placeholderLabel.textColor = [UIColor redColor];        // 设置placeholder开始颜色(方式二)      [self setValue:[UIColor greenColor] forKeyPath:SJPlacerholderColorKeyPath];      // 不成为第一响应者      [self resignFirstResponder];  }    /**   * 当前文本框聚焦时就会调用   */  - (BOOL)becomeFirstResponder  {      // 修改占位文字颜色      [self setValue:[UIColor redColor] forKeyPath:SJPlacerholderColorKeyPath];      return [super becomeFirstResponder];  }    /**   * 当前文本框失去焦点时就会调用   */  - (BOOL)resignFirstResponder  {      // 修改占位文字颜色      [self setValue:[UIColor greenColor] forKeyPath:SJPlacerholderColorKeyPath];      return [super resignFirstResponder];  }  @end</code></pre>    <ul>     <li>效果</li>    </ul>    <p><img src="https://simg.open-open.com/show/f23f66ea95cb1bfb47cea4b03446c781.png"></p>    <p style="text-align:center">未进入编辑状态</p>    <p><img src="https://simg.open-open.com/show/2e2e14fa5c6e1af41db5626b88463ca3.png"></p>    <p style="text-align:center">进入编辑状态</p>    <p> </p>    <p>来自:http://www.jianshu.com/p/de0f819a1576</p>    <p> </p>