我们都知道ios开发中的uitextfield有个placeholder属性,placeholder可以很方便引导用户输入。但是uitextview却没有placeholder属性。
一、猥琐的方法
如何让uitextview也有placeholder功能呢?今天给各位分享一个比较猥琐的做法。思路大概是这样的:
- 把uitextview的text当placeholder使用。
- 在开始编辑的代理方法里清除placeholder。
- 在结束编辑的代理方法里在设置placeholder。
实现方法:
1.创建uitextview:
uitextview *textviewplaceholder = [[uitextview alloc] initwithframe:cgrectmake(20, 70, screen.width - 40, 100)];
textviewplaceholder.backgroundcolor = [uicolor whitecolor];
textviewplaceholder.text = @"jb51.net";
textviewplaceholder.textcolor = [uicolor graycolor];
textviewplaceholder.delegate = self;
[self.view addsubview:textviewplaceholder];
初始化uitextview,给uitextview的text赋值,并且给uitextview的textcolor属性设置成灰色,让其看起来更像placeholder。
别忘了设置uitextview的代理,因为后面我们要用到uitextview的两个代理方法。
2.开始编辑的代理方法:
- (void)textviewdidbeginediting:(uitextview *)textview {
if ([textview.text isequaltostring:@"jb51.net"]) {
textview.text = @"";
textview.textcolor = [uicolor blackcolor];
}
}
在开始编辑的代理方法里面,判断如果是uitextview的text的值是placeholder,那么,就清空text,并且把textcolor设置成真正的内容颜色,假设是黑色。
3.结束编辑的代理方法:
- (void)textviewdidendediting:(uitextview *)textview {
if (textview.text.length textview.text = @"jb51.net";
textview.textcolor = [uicolor graycolor];
}
}
在结束编辑的代理方法里,判断如果uitextview的text值为空,那么,就要把需要设置的placeholder赋值给uitextview的text,并且将textcolor属性设置成灰色。
4.添加轻击手势
uitapgesturerecognizer *tapgesture = [[uitapgesturerecognizer alloc] initwithtarget:self action:@selector(tapgesture:)];
tapgesture.numberoftapsrequired = 1; //点击次数
tapgesture.numberoftouchesrequired = 1; //点击手指数
[self.view addgesturerecognizer:tapgesture];
//轻击手势触发方法
-(void)tapgesture:(uitapgesturerecognizer *)sender
{
[self.view endediting:yes];
}
至此,就很猥琐的实现了placeholder功能。为了方便测试,我加了一个手势。作用是用键盘消失,这样可以测试结束编辑的时候placeholder会不会显示。
demo地址:iosstrongdemo
二、通常的方法
接下来来看比较通常的方法,哈哈~那么,这一次我将简单的封装一个uitextview。暂且取名叫ggplaceholdertextview,gg前缀看着有点任性的哈。
ggplaceholdertextview简介:
ggplaceholdertextview也是对text操作,具体逻辑如下:
继承uitextview,并设置placeholder属性:
注册开始编辑和结束编辑通知,然后对text做相应的操作
通过uiapplicationwillterminatenotification通知,在app退出的时候移除通知。
我把ggplaceholdertextview写在下面。不过,微信里看代码还是不太方便,我已经把代码push到:iosstrongdemo。你可以下载下来。
ggplaceholdertextview.h
#import
@interface ggplaceholdertextview : uitextview
@property(nonatomic, strong) nsstring *placeholder;
@end
定义placeholder属性,类似于uitextfield。
ggplaceholdertextview.m
#import "ggplaceholdertextview.h"
@implementation ggplaceholdertextview
- (id)initwithframe:(cgrect)frame {
if (self = [super initwithframe:frame]) {
[self addobserver];
}
return self;
}
- (id)init {
if (self = [super init]) {
[self addobserver];
}
return self;
}
- (void)setplaceholder:(nsstring *)placeholder
{
_placeholder = placeholder;
self.text = placeholder;
self.textcolor = [uicolor graycolor];
}
-(void)addobserver
{
//注册通知
[[nsnotificationcenter defaultcenter] addobserver:self selector:@selector(didbeginediting:) name:uitextviewtextdidbegineditingnotification object:self];
[[nsnotificationcenter defaultcenter] addobserver:self selector:@selector(didendediting:) name:uitextviewtextdidendeditingnotification object:self];
[[nsnotificationcenter defaultcenter] addobserver:self selector:@selector(terminate:) name:uiapplicationwillterminatenotification object:[uiapplication sharedapplication]];
}
- (void)terminate:(nsnotification *)notification {
//移除通知
[[nsnotificationcenter defaultcenter] removeobserver:self];
}
- (void)didbeginediting:(nsnotification *)notification {
if ([self.text isequaltostring:self.placeholder]) {
self.text = @"";
self.textcolor = [uicolor blackcolor];
}
}
- (void)didendediting:(nsnotification *)notification {
if (self.text.length self.text = self.placeholder;
self.textcolor = [uicolor graycolor];
}
}
@end
以上就是关于ggplaceholdertextview的实现,如果你有类似需求,直接拿去用吧!具体用法请往下看。
实践:
ggplaceholdertextview *textview = [[ggplaceholdertextview alloc] initwithframe:cgrectmake(0, 64, screen.width , 200)];
textview.backgroundcolor = [uicolor whitecolor];
textview.placeholder = @"jb51.net";
[self.view addsubview:textview];
经过封装后的ggplaceholdertextview,使用起来是不是跟uitextfield非常相似。当然,我封装的比较简单,github上也有一些朋友封装带placeholder属性的uitextview。比如:textviewplaceholder。感兴趣的童鞋可以去试用一下。