UITextView添加一个placeholder功能

控件UITextField有个placeholder属性,UITextField和UITextView使用方法基本类似,有两个小区别:1.UITextField单行输入,而UITextView可以多行输入。2.UITextField有placeholder属性,而UITextView没有。至于两者的代理方法,原理基本差不多,只是方法名略有差异。

实现该功能有两种方式 一种是 ①使用通知 显示隐藏遮盖物

②使用代理 给文本框重新赋值

1.在创建textView的时候,赋值其文本属性

即textView.text = @"想说的话";

2.在开始编辑和结束编辑的代理方法中进行判断

 1 //
 2 //  ViewController.m
 3 //  绘制TextView
 4 //
 5 //  Created by zjj on 15/7/1.
 6 //  Copyright (c) 2015年 zjj. All rights reserved.
 7 //
 8
 9 #import "ViewController.h"
10 #import "DJTextView.h"
11 #import "DJplaceHolderTextView.h"
12 @interface ViewController () <UITextViewDelegate>
13 @property (nonatomic,strong)DJplaceHolderTextView *placeHolderText;
14 @end
15
16 @implementation ViewController
17
18 - (void)viewDidLoad {
19     [super viewDidLoad];
20     UITextField *text1 = [[UITextField alloc]initWithFrame:CGRectMake(150, 150, 100, 30)];
21     text1.backgroundColor = [UIColor grayColor];
22     text1.placeholder = @"请输入账号";
23     text1.clearButtonMode = UITextFieldViewModeWhileEditing;
24     [self.view addSubview:text1];
25
26     // 做法① 使用通知 用一个UIlabel遮盖再UItextView上面 根据输入文字是否为0来隐藏显示遮盖物 文字提示
27     DJTextView *text = [[DJTextView alloc]initWithFrame:CGRectMake(50, 50, 100, 100)];
28     text.backgroundColor = [UIColor grayColor];
29     text.placeholder = @"请输入账号";
30     text.placeholderColor = [UIColor whiteColor];
31     [self.view addSubview:text];
32
33     // 做法② 使用UITextViewDelegate代理 开始编辑和结束编辑事件重新赋值文本属性
34     _placeHolderText = [[DJplaceHolderTextView alloc]initWithFrame:CGRectMake(250, 250, 100, 100)];
35     _placeHolderText.backgroundColor = [UIColor grayColor];
36     _placeHolderText.placeholder = @"请输入账号";
37     _placeHolderText.text = _placeHolderText.placeholder;
38     _placeHolderText.delegate = self;
39     [self.view addSubview:_placeHolderText];
40 }
41 /**
42  *  开始编辑事件
43  */
44 - (void)textViewDidBeginEditing:(UITextView *)textView
45 {
46 //  NSLog(@"textViewDidBeginEditing%@ - %ld - %@",textView.text,textView.text.length,self.placeHolderText.placeholder);
47     if ([textView.text isEqualToString:self.placeHolderText.placeholder]) {
48         textView.text = @"";
49     }
50 }
51 /**
52  *  结束编辑事件
53  */
54 - (void)textViewDidEndEditing:(UITextView *)textView
55 {
56 //    NSLog(@"textViewDidBeginEditing%@ - %ld - %@",textView.text,textView.text.length,self.placeHolderText.placeholder);
57     if (textView.text.length < 1) {
58         textView.text = self.placeHolderText.placeholder;
59     }
60 }
61
62 @end
 // 做法② 使用UITextViewDelegate代理 开始编辑和结束编辑事件重新赋值文本属性
 1 //
 2 //  DJplaceHolderTextView.h
 3 //  绘制TextView
 4 //
 5 //  Created by zjj on 15/7/2.
 6 //  Copyright (c) 2015年 zjj. All rights reserved.
 7 //
 8
 9 #import <UIKit/UIKit.h>
10
11 @interface DJplaceHolderTextView : UITextView
12 /**
13  *  placehold 用户输入前文本提示
14  */
15 @property (nonatomic,copy) NSString *placeholder;
16 @end
// 做法① 使用通知 用一个UIlabel遮盖再UItextView上面 根据输入文字是否为0来隐藏显示遮盖物 文字提示
 1 //
 2 //  DJTextView.h
 3 //  绘制TextView
 4 //
 5 //  Created by zjj on 15/7/1.
 6 //  Copyright (c) 2015年 zjj. All rights reserved.
 7 //
 8
 9 #import <UIKit/UIKit.h>
10 /**
11  *  UITextView 实现 placeholder 及隐藏键盘
12  */
13 @interface DJTextView : UITextView
14 /**
15  *  placehold 用户输入前文本提示
16  */
17 @property (nonatomic,copy) NSString *placeholder;
18 /**
19  *  placeholder 文字颜色
20  */
21 @property (nonatomic,strong)UIColor *placeholderColor;
22 /**
23  *  placeholder 提示label
24  */
25 @property (nonatomic,strong)UILabel *placeholderLabel;
26 /**
27  *  文本改变事件
28  */
29 -(void)textChanged:(NSNotification*)notification;
30 @end
  1 //
  2 //  DJTextView.m
  3 //  绘制TextView
  4 //
  5 //  Created by zjj on 15/7/1.
  6 //  Copyright (c) 2015年 zjj. All rights reserved.
  7 //
  8
  9 #import "DJTextView.h"
 10
 11 @implementation DJTextView
 12
 13
 14 //-(void)setPlaceholder:(NSString *)placeholder
 15 //{
 16 //    _placeholder = placeholder;
 17 //
 18 //    [self setNeedsDisplay];
 19 //}
 20 //
 21 //- (void)drawRect:(CGRect)rect
 22 //{
 23 //
 24 //    [self.placeholder drawInRect:rect withAttributes:nil];
 25 //}
 26
 27 - (void)dealloc
 28
 29 {
 30
 31     [[NSNotificationCenter defaultCenter] removeObserver:self];
 32
 33 //    placeHolderLabel = nil;
 34 //
 35 //    [placeholderColor release]; placeholderColor = nil;
 36 //
 37 //    [placeholder release]; placeholder = nil;
 38
 39 //    [super dealloc];
 40
 41 }
 42
 43
 44
 45 - (void)awakeFromNib
 46
 47 {
 48
 49     [super awakeFromNib];
 50
 51     [self setPlaceholder:@""];
 52
 53     [self setPlaceholderColor:[UIColor lightGrayColor]];
 54
 55     [[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(textChanged:) name:UITextViewTextDidChangeNotification object:nil];
 56
 57 }
 58
 59
 60
 61 - (id)initWithFrame:(CGRect)frame
 62
 63 {
 64
 65     if( (self = [super initWithFrame:frame]) )
 66
 67     {
 68
 69         [self setPlaceholder:@""];
 70
 71         [self setPlaceholderColor:[UIColor lightGrayColor]];
 72
 73         [[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(textChanged:) name:UITextViewTextDidChangeNotification object:nil];
 74
 75     }
 76
 77     return self;
 78
 79 }
 80
 81
 82
 83 - (void)textChanged:(NSNotification *)notification
 84
 85 {
 86
 87     if([[self placeholder] length] == 0)
 88
 89     {
 90
 91         return;
 92
 93     }
 94
 95
 96
 97     if([[self text] length] == 0)
 98
 99     {
100
101         [[self viewWithTag:999] setAlpha:1];
102
103     }
104
105     else
106
107     {
108
109         [[self viewWithTag:999] setAlpha:0];
110
111     }
112
113 }
114
115
116
117 - (void)setText:(NSString *)text {
118
119     [super setText:text];
120
121     [self textChanged:nil];
122
123 }
124
125
126
127 - (void)drawRect:(CGRect)rect
128
129 {
130
131     if( [[self placeholder] length] > 0 )
132
133     {
134
135         if ( self.placeholderLabel == nil )
136
137         {
138
139             self.placeholderLabel = [[UILabel alloc] initWithFrame:CGRectMake(8,8,self.bounds.size.width - 16,0)];
140             self.placeholderLabel.lineBreakMode = UILineBreakModeWordWrap;//过时的
141             self.placeholderLabel.numberOfLines = 0;
142
143             self.placeholderLabel.font = self.font;
144
145             self.placeholderLabel.backgroundColor = [UIColor clearColor];
146
147             self.placeholderLabel.textColor = self.placeholderColor;
148
149             self.placeholderLabel.alpha = 0;
150
151             self.placeholderLabel.tag = 999;
152
153             [self addSubview:self.placeholderLabel];
154
155         }
156
157
158
159         self.placeholderLabel.text = self.placeholder;
160
161         [self.placeholderLabel sizeToFit];
162
163         [self sendSubviewToBack:self.placeholderLabel];
164
165     }
166
167
168
169     if( [[self text] length] == 0 && [[self placeholder] length] > 0 )
170
171     {
172
173         [[self viewWithTag:999] setAlpha:1];
174
175     }
176
177
178
179     [super drawRect:rect];
180
181 }
182 ////隐藏键盘,实现UITextViewDelegate
183 //
184 //-(BOOL)textView:(UITextView *)textView shouldChangeTextInRange:(NSRange)range replacementText:(NSString*)text
185 //
186 //{
187 //
188 //    if ([text isEqualToString:@"\n"]) {
189 //
190 //        [textView resignFirstResponder];
191 //
192 //        return NO;
193 //
194 //    }
195 //
196 //    return YES;
197 //
198 //}
199
200 @end

推荐使用第一种

时间: 2024-12-14 18:43:08

UITextView添加一个placeholder功能的相关文章

不能因为为了添加一个新功能,影响到旧的功能

涉及到后台的, 一般都是要跟数据库打交道的大型数据量的处理问题.以类 client - server 为基础的架构, 或者变形后的架构. 客户端处理用户的输入和数据, 然后大量的客户端(多个客户端的多种数据) 反馈到服务端统一处理和协调, 然后服务端对客户端发出相应的指令.其中 后台程序 代表的就是服务端的程序. 包含以下几点:1. 网络通信,  要跟远程的client打交道,只能用网络2. 并发 和 并行处理.0.. 多个客户端可能在同一时间同时需要处理同一个类型的数据, 谁先谁后,谁的有效谁

为Pythonic论坛添加一个“专题”功能(续)

上篇博文<为Pythonic论坛添加一个“专题”功能>,在模板的层次上对发帖进行了限制.也就是根据用户是否拥有权限来决定是否显示发帖框. 但是自从这么“投机取巧”的写完模板后,整夜辗转反侧,不知道用户能否通过其它节点在不能够发帖的节点本地添加发帖框实现发帖. 最终,我还是觉得不靠谱…需要在服务端也进行下验证.简单的处理,终于填了坑 翻看\apps\topic\views.py文件找到def topic_create(request, node_slug):函数定义. if node.categ

iOS 给UITextView加一个placeholder

苹果并没有为UITextView提供placeholder功能.我们可以通过两种办法实现. 方法一: 思路:设置默认显示的文字,颜色设置为灰色.代理方法监听textView的开始编辑和结束编辑时候的字数. 缺点:如果点击到文字上的时候,光标不会出现在textView的一开始的地方.和原生placeholder不同. 1 _contentText = [[UITextView alloc] init]; 2 _contentText.text = @"请输入您的反馈"; 3 _conte

为Pythonic论坛添加一个“专题”功能

代码还没读完就踏上了修改功能的深坑.还好思路清晰,通过修改模板和视图,实现了专题模块 原论坛的模式是用户点击节点发帖,然后就归到节点的分类里面了.我需要一个功能,就是右侧需要一个专题区,管理员发帖的话需要显示在那里.为了尽量小的修改实现功能,我决定设置一个管理员节点,然后在视图调用数据库过滤出节点,就可以了. ------ 那么问题出现了,既然是节点,所有用户都可以点击节点发帖,这岂不乱了? 于是,我打起了发帖框的主意,如果能使用什么方法,使普通用户点击这个节点时不显示发帖框,管理员点击显示发帖

教大家如何给UITextView添加placeholder扩展

如何扩展UITextView以追加placeholder功能呢? 我们的需求是:追加placeholder功能 方案讨论: 通过继承UITextView的方式 通过扩展UITextView的方式 分析:方案1使用继承方式实现起来更简单,但是使用起来就没有那么方便:方案2 使用扩展的方式,实现起来稍比前者复杂,但是外部使用起来更简单 方案定位:采用扩展的方式,以极简的风格作为参考依据. Tip:所谓极简,即对外接口最简,对内部可以很复杂 扩展头文件 #import <UIKit/UIKit.h>

UITextView实现Placeholder功能

在ios中我们UITextField有Placeholder的功能,但是UITextView却没有这个方法,有时候我们也需要实现这样的Placeholder功能,StackOverFlow给我们提供了一个重写UITextView的方法,少量代码就实现了这个功能,值得学习一下.. #import <UIKit/UIKit.h> @interface UIPlaceHolderTextView : UITextView @property (nonatomic, retain) NSString

UITextView添加Placeholder(swift)

UITextView添加Placeholder(swift) by 伍雪颖 添加UILabel并初始化 public let placeholderLabel: UILabel = UILabel() @IBInspectable public var placeholder: String = "" { didSet { placeholderLabel.text = placeholder } } @IBInspectable public var placeholderColor

为Unity开发的android手机游戏添加一个社会化分享功能

先看一下我最近自己做的一个游戏的效果图,然后在为大家讲述怎么做这样一个分享功能,如果图片不直观,当然如果你也不介意我顺便宣传一下我的游戏,你可以点击以下这个链接,下载我的游戏,进去体验一下里面的这个分享功能:http://zhushou.360.cn/detail/index/soft_id/2954399?recrefer=SE_D_BubbleDeer 好了,接下来我们就来一起探讨一下这个分享功能怎么做. (1)提供下载一个社会化分析的SDK,这个我用的是mob.com网的ShareSDK,

在GridView里添加一个功能按钮

标题描述的不是特别清楚,其实最直接明了的就是看一张图 在这幅图里,主要的布局就是一个GridView组件,拍摄照片是个相当于一个按钮的组件,然后其他的内容都是一张张图片,如果单独为了添加一个按钮而自定义个组件,那么是很费劲的! 正常情况下,使用GridView,效果是这样的' 如果实现和微信界面类似的效果,怎么办呢? 主要修改点在GridView的BaseAdapter里,修改它就能实现微信的效果了.其它部分就不着重说明了,主要说明这个BaseAdapter 首先需要思考,GridView的数据