一行代码搞定UITextView的placeholder

分类已经写好,直接拿来用即可

demo:

UITextView *textView = [[UITextView alloc] init];

textView.font = [UIFont systemFontOfSize:18.0]; //注意先设置字体,再设置placeholder

textView.placeholder = @"请输入您的问题...";

主要技术点:

用运行时动态绑定一个label来显示placeholder

详细代码:(已封装好的分类)

 1 /** 注意先设置textView的字体 */
 2
 3 #import "UITextView+placeholder.h"
 4 #import <objc/runtime.h>
 5
 6 #define LEFT_MARGIN 5
 7 #define TOP_MARGIN  8
 8
 9 @implementation UITextView (placeholder)
10
11 - (NSString *)placeholder{
12      return self.label.text;
13 }
14
15 - (void)setPlaceholder:(NSString *)placeholder{
16
17     //赋值修改高度
18     self.label.text = placeholder;
19     [self changeLabelFrame];
20
21     //监听文本改变,如果没有设置placeholder就不会监听
22     [[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(textDidChange:) name:UITextViewTextDidChangeNotification object:nil];
23 }
24
25 //文本修改
26 - (void)textDidChange:(NSNotification *)notify{
27    self.label.hidden = self.text.length;
28 }
29
30 - (UILabel *)label{
31
32     UILabel *label =  objc_getAssociatedObject(self, @"label");
33
34     if (label == nil) {
35         //没有就创建,并设置属性
36         label = [[UILabel alloc] init];
37         label.font = self.font;
38         label.textColor = [UIColor grayColor];
39         label.textAlignment = NSTextAlignmentLeft;
40         label.numberOfLines = 0;
41
42         [self addSubview:label];
43
44         //关联到自身
45         objc_setAssociatedObject(self, @"label", label, OBJC_ASSOCIATION_RETAIN);
46
47     }
48
49     return label;
50 }
51
52 //计算frame
53 - (void)changeLabelFrame{
54     //文字可显示区域
55     CGSize size = CGSizeMake(self.bounds.size.width - 2*LEFT_MARGIN, CGFLOAT_MAX);
56     //计算文字所占区域
57     CGSize labelSize = [self.placeholder boundingRectWithSize:size options:NSStringDrawingUsesLineFragmentOrigin attributes:@{NSFontAttributeName : self.label.font} context:nil].size;
58
59     self.label.frame = CGRectMake(LEFT_MARGIN, TOP_MARGIN, labelSize.width, labelSize.height);
60 }
61 @end

打包地址:

https://github.com/iOSSinger/UITextView-placeholder.git

时间: 2024-10-19 15:38:57

一行代码搞定UITextView的placeholder的相关文章

Java一行代码搞定两个数互换

提到两个数互换,首先想到的应该是如何不引入第三个数实现,当然也有很多方法. 想到个有趣的事就是怎么用一行代码搞定互换,其实也不难. 先来两种小学生写法: a = a + b - (b = a); a = a * b / (b = a); 以上两句结果一样,就是把a,b值互换. 还有一种无赖写法: a = b + (b = a) * 0; 稍高端的写法是: a = a ^ b ^ (b = a); 这个原理就是一个数异或另一个数两次值不变.

一行代码搞定Adapter

15年Google I/O大会发不了三个重要支持库 >Material design (Android Support Design) >百分比布局:Percent support lib >数据绑定: Data Binding Library 如果你还不没用过Data Bind Library 没关系 那你知道ButterKnife吧 DataBindLibrary 和ButterKnife都是编译时期生成相应的注解文件 因此 在性能上不会有什么大的影响 因此放心的尝试吧.(个人感觉D

一行代码搞定所有屏幕适配

一行代码搞定所有屏幕适配AbViewUtil andbase框架 介绍:http://blog.csdn.net/menglele1314/article/details/46422409 andbase框架 下载:http://download.csdn.net/detail/menglele1314/8786989 导入andbase开源框架 1.首先在你的应用的application中设置: AbAppConfig.UI_WIDTH = 1080; AbAppConfig.UI_HEIGH

iOS 3DES加密解密(一行代码搞定)

3DES(或称为Triple DES)是三重数据加密算法(TDEA,Triple Data Encryption Algorithm)块密码的通称.它相当于是对每个数据块应用三次DES加密算法.由于计算机运算能力的增强,原版DES密码的密钥长度变得容易被暴力破解:3DES即是设计用来提供一种相对简单的方法,即通过增加DES的密钥长度来避免类似的攻击,而不是设计一种全新的块密码算法. 3DES又称Triple DES,是DES加密算法的一种模式,它使用3条56位的密钥对数据进行三次加密.数据加密标

各种IE(IE6-IE10)兼容问题一行代码搞定

x-ua-compatible 用来指定IE浏览器解析编译页面的model x-ua-compatible 头标签大小写不敏感,必须用在 head 中,必须在除 title 外的其他 meta 之前使用. 1.使用一行代码来指定浏览器使用特定的文档模式. <meta http-equiv="x-ua-compatible" content="IE=9" > <meta http-equiv="x-ua-compatible" c

一行代码搞定ThoughtWorks面试题

今天在微博看到一道有趣的题目.作为python的脑残粉,自然手痒. 题目在这里. FizzBuzzWhizz 你是一名体育老师,在某次课距离下课还有五分钟时,你决定搞一个游戏.此时有100名学生在上课.游戏的规则是: 1. 你首先说出三个不同的特殊数,要求必须是个位数,比如3.5.7. 2. 让所有学生拍成一队,然后按顺序报数. 3. 学生报数时,如果所报数字是第一个特殊数(3)的倍数,那么不能说该数字,而要说Fizz:如果所报数字是第二个特殊数(5)的倍数,那么要说Buzz:如果所报数字是第三

Android防止过快点击造成多次事件 一行代码搞定,特别简单,可以复用

onClick事件是Android开发中最常见的事件,正常情况下这段代码是没什么问题的, 但是Android设备的机型性能等千差万别,如果碰到比较卡的手机, 则有可能出现submitOrder()函数跳转页面出现延迟的现象.碰到这种现象,则用户就很有可能再次点击一次, 从而造成函数被调用两次,出现重复订单的BUG. 解决方法 方案一:(不建议) 一般地,碰到这现象,首先就会想到的就是在点击之后把submitButton设置为不可点击: 此方法也确实有效,不过如果submitOrder()方法没有

一行命令搞定没有Visual Studio2003(2005)时的手动编译

一行命令搞定没有Visual Studio2003(2005)时的手动编译命令 起因: 有时可能会发生这样的情况,网站做好了,要在服务器上布署.布署中发现,有些地方代码需要小改,然而,在服务器或其他地方没有安装VS系列工具,但服务器上已安装有.net框架,此时仍然需要对已有项目的某些文件进行少量修改,并再次进行编译.此时,在服务器上安装VS系列开发工具并不可能,也不经济.那么下面的方法就可以派上用场了. (1)将下面一行保存到你项目所在的目录下一个名为:buid.bat文件中: %SYSTEMR

史上最牛逼的javascript俄罗斯方块,63行代码搞定啊

<!doctype html><html><head></head><body> <div id="box" style="width:252px;font:25px/25px 宋体;background:#000;color:#9f9;border:#999 20px ridge;text-shadow:2px 3px 1px #0f0;"></div> <script>