• 思路分析:

    • 0.自定义UITextField
    • 1.设置占位文字的颜色找-->placeholderColor,结果发现UITextField没有提供这个属性
    • 2.在storyboard/xib中寻找设置placeholder的属性,也没有发现
    • 3.发现UITextField中有- (void)drawPlaceholderInRect:(CGRect)rect;,这个方法用到QuartzD中的知识,可以试试;
    • 4.打印UITextField的子控件,查看是否有设置placeholder的属性
    • 5.用运行时,查看UITextField中内部的结构,看有没有隐藏属性,利用KVC,可以强制使用任何私有属性
      -

方法一:

  • 缺点:只能设置一次状态,不能动态的改变Placeholder的颜色
- (void)drawPlaceholderInRect:(CGRect)rect
{// 设置富文本属性NSMutableDictionary *dictM = [NSMutableDictionary dictionary]; dictM[NSFontAttributeName] = self.font; dictM[NSForegroundColorAttributeName] = [UIColor redColor]; CGPoint point = CGPointMake(0, (rect.size.height - self.font.lineHeight) * 0.5); [self.placeholder drawAtPoint:point withAttributes:dictM]; }
- (void)awakeFromNib
{DXLog(@"%@",self.subviews);
}
// 打印结果发现为空 // 猜测UITextField控件是懒加载的,调用这个方法的时候,它还没有加载storyboard/xib中的控件 // 利用GCD延时设置-->等storyboard/xib中的控件加载完毕在调用这个方法 dispatch_after(dispatch_time(DISPATCH_TIME_NOW, (int64_t)(0.01 * NSEC_PER_SEC)), dispatch_get_main_queue(), ^{ DXLog(@"%@",self.subviews); }); // 打印结果是数组,里面有`UITextFieldLabel`,好像没有多大用

利用运行时,查看UITextField中内部的结构

// 这个方法调用时刻:当一个控件从xib或者storyBoard中创建之前,就会调用这个方法
- (void)awakeFromNib
{unsigned int count = 0; Ivar *ivarList = class_copyIvarList([UITextField class], &count); for (int i = 0; i<count; i++) { Ivar ivar = ivarList[i]; DXLog(@"%s",ivar_getName(ivar)); } free(ivarList); } // 结果一大堆属性,其中有_placeholderLabel // 利用KVC设置它颜色,结果成功 UILabel *label = [self valueForKeyPath:@"_placeholderLabel"]; label.textColor = [UIColor orangeColor];

方法二:有了placeholderLabel.textColor这个属性,在storyboard/xib中利用KVC设置placeholder颜色,如图

placeholder.png

方法三:用 setAttributedPlaceholder方法

NSMutableDictionary *dict = [NSMutableDictionary dictionary];
dict[NSForegroundColorAttributeName] = [UIColor redColor];
NSAttributedString *attribute = [[NSAttributedString alloc] initWithString:self.placeholder attributes:dict]; [self setAttributedPlaceholder:attribute];

下面用四种方法,动态的设置placeholderLabel的颜色

方法一:addTarget

// 为了书写方便,便于管理,定义一个不可变的全局变量;
static NSString * const DXPlaceholderColorKey = @"placeholderLabel.textColor"; - (void)awakeFromNib { [self addTarget:self action:@selector(editingDidBegin) forControlEvents:UIControlEventEditingDidBegin]; [self addTarget:self action:@selector(editingDidEnd) forControlEvents:UIControlEventEditingDidEnd]; } - (void)editingDidBegin { [self setValue:[UIColor whiteColor] forKeyPath:DXPlaceholderColorKey]; } - (void)editingDidEnd { [self setValue:[UIColor grayColor] forKeyPath:DXPlaceholderColorKey]; }

方法二:代理-->遵守协议,自己做自己的代理

- (void)awakeFromNib
{self.delegate = self;
}
#pragma mark -------- <UITextFieldDelegate>--------- - (void)textFieldDidBeginEditing:(UITextField *)textField { [self setValue:[UIColor whiteColor] forKeyPath:DXPlaceholderColorKey]; } - (void)textFieldDidEndEditing:(UITextField *)textField { [self setValue:[UIColor grayColor] forKeyPath:DXPlaceholderColorKey]; }

方法三:通知

- (void)awakeFromNib
{[[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(editingDidBegin) name:UITextFieldTextDidBeginEditingNotification object:self]; [[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(editingDidEnd) name:UITextFieldTextDidEndEditingNotification object:self]; } - (void)dealloc { [[NSNotificationCenter defaultCenter] removeObserver:self]; } - (void)editingDidBegin { [self setValue:[UIColor whiteColor] forKeyPath:DXPlaceholderColorKey]; } - (void)editingDidEnd { [self setValue:[UIColor grayColor] forKeyPath:DXPlaceholderColorKey]; }

方法四:重写文本框特有的方法

- (void)awakeFromNib
{[self setValue:[UIColor grayColor] forKeyPath:DXPlaceholderColorKey];
}
- (BOOL)becomeFirstResponder
{[self setValue:[UIColor whiteColor] forKeyPath:DXPlaceholderColorKey]; return [super becomeFirstResponder]; } - (BOOL)resignFirstResponder { [self setValue:[UIColor grayColor] forKeyPath:DXPlaceholderColorKey]; return [super resignFirstResponder]; }

 

转载于:https://www.cnblogs.com/fengmin/p/5314500.html

iOS-UITextField中给placeholder动态设置颜色的四种方法相关推荐

  1. 页面中如何引用外部的HTML(四种方法)

    页面中如何引用外部的HTML(四种方法) 一.总结 一句话总结:a.iframe标签        b.ajax引入代码片段        c.link import的方法导入        d.re ...

  2. HTML前端页面颜色的四种方法,色号表

    HTML前端页面颜色的四种方法,色号表 颜色的三种表示方式: (1)单词:red green black-用法: <font color="pink" size=" ...

  3. js之删除对象属性的三种方法 判断对象中是否有某一属性的四种方法

    js之删除对象属性的三种方法 & 判断对象中是否有某一属性的四种方法 示例 1.基础版 var a = { id: 18, age: 20, name: "zhangsan" ...

  4. 【Qt】QTableView中嵌入复选框CheckBox 的四种方法总结

    搜索了一下,QTableView中嵌入复选框CheckBox方法有四种: 第一种不能之前显示,必须双击/选中后才能显示,不适用. 第二种比较简单,通常用这种方法. 第三种只适合静态显示静态数据用 第四 ...

  5. android中完全退出当前应用程序的四种方法

    Android程序有很多Activity,比如说主窗口A,调用了子窗口B,如果在B中直接finish(), 接下里显示的是A.在B中如何关闭整个Android应用程序呢?本人总结了几种比较简单的实现方 ...

  6. ios开发跳转safari_iOS 跳转网页的四种方法

    跳转界面 push 展示网页 1.Safari : openURL:自带很多功能 (进度条,刷新,前进,倒退..)就是打开了一个浏览器,跳出自己的应用 2.UIWebView: 没有功能,在当前应用中 ...

  7. java indexof 子字符串_Java中字符串中子串的查找共有四种方法(indexof())

    Java中字符串中子串的查找共有四种方法(indexof()) Java中字符串中子串的查找共有四种方法,如下: 1.int indexOf(String str) :返回第一次出现的指定子字符串在此 ...

  8. css表格设置行列的颜色,CSS:为表格中的选定行设置颜色

    我需要将以下功能添加到我的表中:当用户单击某行(选择它)时,该行用颜色#FFCF8B标记(与hover相同).我试过#newspaper-b tbody tr.selected td,但它不起作用.C ...

  9. ABAP中创建动态内表的三种方法(转载)

    BAP中创建动态内表的三种方法 第一种: 如果我们需要的动态内表字段或者动态工作区和数据字典中的类型一致,可以直接使用CREATE DATA生成,当然也可以是自定义类型. 比如要产生和数据表MARA结 ...

最新文章

  1. Splunk学习与实践
  2. 东芝再曝财务造假丑闻 日企百年老店怎么了?
  3. ssas 为绑定指定的大小太小,导致一个或多个列值被截断
  4. tableView 使用 reloadSections:withRowAnimation: 时,会跳动的问题
  5. mysql root密码忘记2018_2018-03-28设置及修改mysql用户密码学习笔记
  6. 传入一个MapString,Long 返回它按value排序后的结果
  7. 开发者必看:iOS应用审核的通关秘籍
  8. Win11 无法使用IE11浏览器的解决办法
  9. cordova弹框插件 cordova-plugin-dialogs
  10. 人生就是一个领域,一份爱,一杯茶
  11. 2011年课外书 杂书总结感想
  12. opencv背景抠图
  13. 小米平板2刷哪个系统更流畅_Windows 10版小米平板2简测:流畅度不及自家MIUI版...
  14. Android:利用sdk中的build-tools对包进行签名
  15. Oracle函数之单值函数
  16. r语言计算 java gUI_Windows64位系统用R软件运行rjava程序计算MIC值,以及一些问题...
  17. 举个栗子~Tableau 技巧(216):服务器视图中的文字乱码怎么办?
  18. 大数据性能测试工具Dew --转载自李智慧
  19. SATA 3.0、M.2和PCIe接口,NVMe协议
  20. 基于Web窗体的Web应用程序的优势

热门文章

  1. drools 将添加switch支持
  2. 使用template扩展已有的DDX_Text函数,使扩展能够同时支持各种数据类型的一个例子...
  3. 安装使用dubbo-admin管理台进行服务监控和服务治理
  4. 有关SQL Server 2008你一定要知道的八件事 之三
  5. centos6.3安装Samba及权限
  6. Linux系统下文件与目录操作
  7. 用C# Regex类实现的一些常规输入判断
  8. 正在搜索需要的文件一直在搜索_正在被蚕食的百度搜索
  9. Web请求响应编码问题详解
  10. 全面使用禅道做敏捷开发的规范化管理分享