观察效果图

UITextField有以下几种特点:

1.默认占位文字是灰色的

2.当光标点上去时,占位文字变为白色

3.光标是白色的

接下来我们通过不同的方法来解决问题

一.将xib中的UITextField与代码关联

通过NSAttributeString方法来更改占位文字的属性

- (void)viewDidLoad {
[super viewDidLoad];
// Do any additional setup after loading the view from its nib. //文字属性
NSMutableDictionary *dict = [NSMutableDictionary dictionary];
dict[NSForegroundColorAttributeName] = [UIColor grayColor]; //带有属性的文字(富文本属性)NSAttributeString
NSAttributedString *attr = [[NSAttributedString alloc] initWithString:@"手机号" attributes:dict];
self.phoneField.attributedPlaceholder = attr;
}

但是这种方法只能做出第一种效果,而且不具有通用性。

二.自定义一个UITextField的类

重写它的drawPlaceholderInRect方法

//画出占位文字
- (void)drawPlaceholderInRect:(CGRect)rect {
[self.placeholder drawInRect:CGRectMake(, , self.size.width, ) withAttributes:@{
NSForegroundColorAttributeName : [UIColor grayColor],
NSFontAttributeName : [UIFont systemFontOfSize:]
}];
}

这个方法和上一个方法类似,只能做出第一种效果,但这个具有通用性

三.利用Runtime运行时机制

Runtime是官方的一套C语言库

能做出很多底层的操作(比如访问隐藏的一些成员变量\成员方法)

+ (void)initialize {

    unsigned int count = ;
Ivar *ivars = class_copyIvarList([UITextField class] , &count); for (int i = ; i < count; i++) {
//取出成员变量
Ivar ivar = *(ivars + i); //打印成员变量名字
DDZLog(@"%s",ivar_getName(ivar));
} }

利用class_copyIvarList这个C函数,将所有的成员变量打印出来

这样我们就可以直接通过KVC进行属性设置了

- (void)awakeFromNib {

    //修改占位文字颜色
[self setValue:[UIColor grayColor] forKeyPath:@"_placeholderLabel.textColor"];
//设置光标颜色和文字颜色一致
self.tintColor = self.textColor; }

通过这个方法可以完成所有的效果,既具有通用性也简单

最后一个效果是

在获得焦点时改变占位文字颜色

在失去焦点时再改回去

//获得焦点时
- (BOOL)becomeFirstResponder {
//改变占位文字颜色
[self setValue:self.textColor forKeyPath:@"_placeholderLabel.textColor"];
return [super becomeFirstResponder];

}

//失去焦点时
- (BOOL)resignFirstResponder { //改变占位文字颜色
[self setValue:[UIColor grayColor] forKeyPath:@"_placeholderLabel.textColor"];
return [super resignFirstResponder];
}

浅谈自定义UITextField的方法的更多相关文章

  1. 浅谈 js 字符串 trim 方法之正则篇

    原文:浅谈 js 字符串 trim 方法之正则篇 关于 trim 其实没啥好说的,无非就是去除首位空格,对于现代浏览器来说只是简单的正则 /^\s+|\s+$/ 就可以搞定了.而且支持中文空格   等 ...

  2. 浅谈 js 字符串 search 方法

    原文:浅谈 js 字符串 search 方法 这是一个很久以前的事情了,好像是安心兄弟在学习js的时候做的练习.具体记不清了,今天就来简单分析下 search 究竟是什么用的. 从字面意思理解,一个是 ...

  3. 浅谈 js 对象 toJSON 方法

    前些天在<浅谈 JSON.stringify 方法>说了他的正确使用姿势,今天来说下 toJSON 方法吧.其实我觉得这货跟 toString 一个道理,他是给 stringify 方法字 ...

  4. 浅谈js数据类型识别方法

    js有6种基本数据类型  Undefined , Null , Boolean , Number , String ,Symbol和一种引用类型Object,下面我们就来一一看穿,哦不,识别他们. t ...

  5. 浅谈iOS开发中方法延迟执行的几种方式

    Method1. performSelector方法 Method2. NSTimer定时器 Method3. NSThread线程的sleep Method4. GCD 公用延迟执行方法 - (vo ...

  6. 浅谈ASP.Net ProcessPostData方法

    其实这两次方法做的都是同一件事儿,让我们来看下图片中的代码,唯一的区别就是两次传入的参数不一样,一个是postData集合和Page_Load加载前的标记,另一个是leftoverPostData集合 ...

  7. 浅谈jQuery中setInterval()方法

    定义和用法: setInterval() 方法可按照指定的周期(以毫秒计)来调用函数或计算表达式. setInterval() 方法会不停地调用函数,直到 clearInterval() 被调用或窗口 ...

  8. Java:浅谈InputStream的close方法

    原则:最好在任何时候使用InputStream或者OutputStream的时候,在finally中调用close()方法,显式关闭. 一个典型的示例 InputStream in = null; t ...

  9. [iOS、Unity、Android] 浅谈闭包的使用方法

    前言 我们经常所编程语言的的进步速度是落后于硬件的发展速度的. 但是最近几年,闭包语法在各个语言中都有自己的体现形式,例如 • C语言中使用函数指针作为回调函数的入口: • Java和C#语言中的La ...

随机推荐

  1. VS2015 新Web项目(C#6)出现CS1617错误的解决

    VS2015新增了对C#6的支持. 在新的Web项目模板中通过引入nuget包Microsoft.CodeDom.Providers.DotNetCompilerPlatform:1.0.0并在web ...

  2. Unrecognized attribute 'targetFramework'. Note that attribute names are case-sensitive.

    调试网站时,异常出现:Unrecognized attribute 'targetFramework'. Note that attribute names are case-sensitive. S ...

  3. jQuery动态设置样式List item

    前段时间,Insus.NET有修改一个功能<激活当前视图菜单高亮呈现>http://www.cnblogs.com/insus/p/5287093.html 今天Insus.NET想改用另 ...

  4. java实现可有括号的android计算器

    写了一个android版的计算器,可以计算带括号的表达式,不过前提是:正确的表达式才行 小缺陷是没有做表达式括号的控制,现在还没有想到好的控制方式 package javaAdvanced; impo ...

  5. MDI窗体容器 权限设置

    MDI窗体容器:它可以让其它窗体在它的内部打开,无法超出它的范围将某个窗体的属性:IsMdiContainer设置为true - 窗口样式如何将其它窗体在它的内部打开?窗体对象名.MdiParent ...

  6. 关于js性能

    1,声明变量要赋初值2,尽量避免声明全局变量,可以减少与系统的重名3,当编写大量js代码时,难免会遇到命名冲突,这是可以通过模拟命名空间方式     来避免冲突4,尽量避免使用全局变量,搜索全局变量是 ...

  7. 在Excel中使用频率最高的函数的功能和使用方法

    在Excel中使用频率最高的函数的功能和使用方法,按字母排序: 1.ABS函数 函数名称:ABS 主要功能:求出相应数字的绝对值. 使用格式:ABS(number) 参数说明:number代表需要求绝 ...

  8. Entity Framework 6 执行Linq to Entities异常"p__linq__1 : String truncation: max=0, len=2, value='测试'"

    场景再现 我需要查询公司名称包含给定字符串的公司,于是我写了下面的测试小例子: var condition = "测试"; var query = from b in db.Com ...

  9. 最短路径---Dijkstra/Floyd算法

    1.Dijkstra算法基础: 算法过程比prim算法稍微多一点步骤,但思想确实巧妙也是贪心,目的是求某个源点到目的点的最短距离,总的来说dijkstra也就是求某个源点到目的点的最短路,求解的过程也 ...

  10. HTML标签小结

    HTML:超文本标记语言 超:超链接       超文本:超出文本(可加入图片,文字,音频视频播放器)  标记:标签 HTML文档 以<html...>开始 , 以</html> ...