玩转iOS中UITextField的placeholder颜色
ieyong
8年前
<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>