如何实现在TextView使用占位符(placeholder)
2015-11-18 12:27
417 查看
近期在开发中遇到了一个需求,就是要在textView中添加一个占位符,类似于textField的placeholder,但是经过查询,发现textView并没有placeholder属性。 随意只能自己重写了。其实原理很简单,分为两步
1、创建一个label加入textView中。
2、判断状态,如果在输入,就隐藏label。
其实主要就是这两步,我们接下来就开始封装一个类,来实现这个功能。
创建一个类集成UITextView
定义两个属性
首先自然是要先懒加载一个UILabel
Q:为什么这个UIlabel要懒加载
A:如果不懒加载,否则,没设置一次就会加载一次,造成内存浪费
然后重写这个Label的get属性,即懒加载:
接下来在在实现文件中重写placeholder属性的set方法:
但是运行时发现,占位符的字号和即将输入的字号不同,这个时候我们就要调整Label的字条,使UILabel的字号和占位符的字号一致。
为了不造成资源浪,我们重写intwithFrame方法,在其中设置光标的字号,代码如下:
这样,是不是就重合了呢,第一步就完成了,接下来就要实现隐藏功能了。
重写hidenplaceholder的set方法:
然后在你创建textView的时候进行判断。如果监听到输入,就隐藏Label,这个时候就要用到通知了。
自然,第一步,订阅通知:
然后我们实现这个textChange方法就可以了
订阅了通知,记得退订通知
这样。封装一个TextView类的占位符功能就完成了。下次如果还要使用,直接导入.h和.m文件就可以使用了。
可能描述的不是很清楚。详细代码如下
XXTextView.h
XXTextView.m
接下来在ViewController中创建一个UITextView
如果写得不好,或者有问题,请联系作者修正
1、创建一个label加入textView中。
2、判断状态,如果在输入,就隐藏label。
其实主要就是这两步,我们接下来就开始封装一个类,来实现这个功能。
创建一个类集成UITextView
定义两个属性
//这里接收占位符的字符串 @property (nonatomic, copy) NSString *placeHolder; //用来判断是否隐藏占位符的label @property (nonatomic, assign) BOOL hidenPlaceHolder;
首先自然是要先懒加载一个UILabel
Q:为什么这个UIlabel要懒加载
A:如果不懒加载,否则,没设置一次就会加载一次,造成内存浪费
//在分类中添加一个uiLabel属性 @interface XXTextView () @property (nonatomic, weak) UILabel *placeHolderLabel; @end
然后重写这个Label的get属性,即懒加载:
//懒加载这个Label -(UILabel *)placeHolderLabel{ if (_placeHolderLabel == nil) { //创建label UILabel *label = [[UILabel alloc] initWithFrame:CGRectMake(5, 7, 30, 20)]; label.textColor = [UIColor lightGrayColor]; //给label赋值 _placeHolderLabel = label; //将label显示在试图上 [self addSubview:label]; } return _placeHolderLabel; }
接下来在在实现文件中重写placeholder属性的set方法:
//重写placeholder的set方法 -(void)setPlaceHolder:(NSString *)placeHolder{ _placeHolder = placeHolder; self.placeHolderLabel.text = placeHolder; //边界根据内容自适应 [self.placeHolderLabel sizeToFit]; }
但是运行时发现,占位符的字号和即将输入的字号不同,这个时候我们就要调整Label的字条,使UILabel的字号和占位符的字号一致。
为了不造成资源浪,我们重写intwithFrame方法,在其中设置光标的字号,代码如下:
//默认调整字号为16 -(instancetype)initWithFrame:(CGRect)frame{ if (self = [super initWithFrame:frame]) { self.font = [UIFont systemFontOfSize:16]; self.placeHolderLabel.font = self.font; } return self; }
这样,是不是就重合了呢,第一步就完成了,接下来就要实现隐藏功能了。
重写hidenplaceholder的set方法:
//重写hidenplaceholder的set方法 - (void)setHidenPlaceHolder:(BOOL)hidenPlaceHolder{ _hidenPlaceHolder = hidenPlaceHolder; self.placeHolderLabel.hidden = hidenPlaceHolder; }
然后在你创建textView的时候进行判断。如果监听到输入,就隐藏Label,这个时候就要用到通知了。
自然,第一步,订阅通知:
//订阅通知 [[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(textChange) name:UITextViewTextDidChangeNotification object:nil];
然后我们实现这个textChange方法就可以了
- (void)textChange{ [self becomeFirstResponder]; if (_textView.text.length) { //有内容 _textView.hidenPlaceHolder = YES; }else{ _textView.hidenPlaceHolder = NO; } }
订阅了通知,记得退订通知
-(void)dealloc{ [[NSNotificationCenter defaultCenter] removeObserver:self]; }
这样。封装一个TextView类的占位符功能就完成了。下次如果还要使用,直接导入.h和.m文件就可以使用了。
可能描述的不是很清楚。详细代码如下
XXTextView.h
#import <UIKit/UIKit.h> @interface middleViewController : UIViewController @end
XXTextView.m
#import "XXTextView.h" @interface XXTextView () @property (nonatomic, weak) UILabel *placeHolderLabel; @end @implementation XXTextView -(instancetype)initWithFrame:(CGRect)frame{ if (self = [super initWithFrame:frame]) { self.font = [UIFont systemFontOfSize:16]; _placeHolderLabel.font = self.font; } return self; } -(UILabel *)placeHolderLabel{ if (_placeHolderLabel == nil) { //创建label UILabel *label = [[UILabel alloc] initWithFrame:CGRectMake(5, 7, 30, 20)]; label.textColor = [UIColor lightGrayColor]; //给label赋值 _placeHolderLabel = label; //将label显示在试图上 [self addSubview:label]; } return _placeHolderLabel; } - (void)setHidenPlaceHolder:(BOOL)hidenPlaceHolder{ _hidenPlaceHolder = hidenPlaceHolder; self.placeHolderLabel.hidden = hidenPlaceHolder; } -(void)setPlaceHolder:(NSString *)placeHolder{ _placeHolder = placeHolder; self.placeHolderLabel.text = placeHolder; //边界根据内容自适应 [self.placeHolderLabel sizeToFit]; } - (void)setFont:(UIFont *)font{ [super setFont:font]; _placeHolderLabel.font = font; [_placeHolderLabel sizeToFit]; } @end
接下来在ViewController中创建一个UITextView
XXTextView *textView = [[XXTextView alloc] initWithFrame:[UIScreen mainScreen].bounds];
_textView = textView;
//设置占位符
textView.placeHolder = @"快记录今天的心情吧";
[self.view addSubview:textView];
//订阅通知 [[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(textChange) name:UITextViewTextDidChangeNotification object:nil];
如果写得不好,或者有问题,请联系作者修正
相关文章推荐
- 一篇文章看懂Android学习最佳路线
- 可行性研究课后习题4、5
- 安卓App热补丁动态修复技术介绍
- javaweb前端点击小图切换大图
- 从jsp页面导出Excel(IE和其他浏览器下)
- linux下文件的复制、移动与删除
- 嵌入式管脚定义
- MySQL:MySQL+Cluster
- editplus文本编辑在编程中的使用
- java 中文 乱码 读写
- cocos2dx中protobuf的lua使用
- MySQL:MySQL Replication
- 用eclipse浏览linux内核
- 可行性研究课后习题2
- 疯狂Android之图片浏览器
- 关于模板类中静态成员
- MySQL:性能优化
- C-1.基础知识
- mac os x使用Git简易入门教程
- MySQL:MySQL日志