项目要求, 话不多说, 下面直接开始.
第一种: 在自定义 textView 中添加一个 UILabel
这种可行是可行, 但是没怎么见过人往 imageView 啊, textView 啊, 这种控件上面添加控件的, 感觉很怪~
思路就是添加 label 之后在输入文本的时候隐藏 label, 没有文本的时候显示 label即可.
第二种: 利用消息传递, 关联对象等底层实现占位符
这种比较麻烦, 弱鸡如我并看得不顺畅, 下面甩个链接.
点这里
第三种: 用 drawRect 方法直接画一个 placeholder
这种方法我觉得可行度最高, 没啥难度, 代码最不麻烦.
首先我们新建一个自定义文件继承自UITextView
, 然后我们考虑需要修改什么属性, 首先这个自定义控件本身就继承自系统控件, 那么font
, textColor
这些属性可以直接外部修改就行了, 只需要自己设置占位文字和它的相关属性即可(颜色, 字体等等), 如果想修改光标颜色, 那么可能得用到runtime去用kvc修改系统属性, 具体方法请参考这里, 可以试一下, 不知道可行不.
那么来到.h文件:
#import <UIKit/UIKit.h>
@interface ZYNPlaceholderTextView : UITextView
/** 占位符 */
@property (nonatomic, copy) NSString *zyn_placeholder;
/** 占位文字颜色 */
@property (nonatomic, strong) UIColor *placeholderColor;
@end
.h没什么好说的
接下来, 来到.m文件:
这里得知道监听文字改变事件, 系统textView
自带UITextViewTextDidChangeNotification
方法去监听.
首先重写初始化方法:
- (void)dealloc {
[[NSNotificationCenter defaultCenter] removeObserver:self name:UITextViewTextDidChangeNotification object:nil];
}
- (instancetype)initWithFrame:(CGRect)frame {
self = [super initWithFrame:frame];
if (self) {
[self initPrivate];
}
return self;
}
- (void)initPrivate {
// 监听文字改变
[[NSNotificationCenter defaultCenter] addObserver:self
selector:@selector(textDidChange)
name:UITextViewTextDidChangeNotification
object:nil];
}
/**
监听文字改变, 立马显示
*/
- (void)textDidChange {
[self setNeedsDisplay];
}
初始化方法就是监听一下文字改变了没, 记得用完通知要在dealloc
里面释放通知. 监听完文字改变, 我们就可以画占位符了.
打开系统自己注释掉的drawRect
方法:
- (void)drawRect:(CGRect)rect {
// Drawing code
// 如果有文字就不绘制占位文字
if ([self hasText]) {
return;
}
// 设置字体属性
NSMutableDictionary *attrs = [NSMutableDictionary dictionaryWithCapacity:0];
attrs[NSFontAttributeName] = self.font;
attrs[NSForegroundColorAttributeName] = self.placeholderColor;
// 设置占位符大小区域
rect.origin.x = 5;
rect.origin.y = 7;
rect.size.width -= 2 * rect.origin.x;
rect.size.height -= 2 * rect.origin.y;
[self.zyn_placeholder drawInRect:rect
withAttributes:attrs];
}
至此, 大功告成, 可以使用了.
下面是使用方法:
- (void)viewDidLoad {
[super viewDidLoad];
// Do any additional setup after loading the view, typically from a nib.
ZYNPlaceholderTextView *textView = [[ZYNPlaceholderTextView alloc] initWithFrame:CGRectMake(10, 30, [UIScreen mainScreen].bounds.size.width - 20, [UIScreen mainScreen].bounds.size.height - 60)];
textView.backgroundColor = [UIColor grayColor];
textView.zyn_placeholder = @"这是一个占位符";
textView.font = [UIFont systemFontOfSize:22];
textView.textColor = [UIColor redColor];
textView.placeholderColor = [UIColor blueColor];
[self.view addSubview:textView];
}
最后上两张效果图: