在项目中我们有时候会有类似意见反馈
,备注...
等功能点,通常都会用 UITextView
去实现,那么就需要一些弱提示,告诉用户输入文本时需要注意哪些问题,由于 UITextView
暴露出来的属性是不支持设置placeholder
的,但是我们通过runtime
可以发现UITextView
中有一个叫_placeHolderLabel
的私有属性,那么我们就可以用 kvc来访问这个变量。
当然给UITextView
设置placeholder
有很多种方法,但是通过runtime
来实现无非是最合适不过的,首先导入#import <objc/runtime.h>
,#import <objc/message.h>
。
通过遍历找到这个私有变量_placeHolderLabel
- (void)viewDidLoad {
[super viewDidLoad];
self.title = @"备注";
self.remarkTextView.delegate = self;
self.automaticallyAdjustsScrollViewInsets = NO;
// 通过运行时,发现UITextView有一个叫做“_placeHolderLabel”的私有变量
unsigned int count = 0;
Ivar *ivars = class_copyIvarList([UITextView class], &count);
for (int i = 0; i < count; i++) {
Ivar ivar = ivars[i];
const char *name = ivar_getName(ivar);
NSString *objcName = [NSString stringWithUTF8String:name];
NSLog(@"%d : %@",i,objcName);
}
[self setupplaceholderLabel];
}
/**
设置placeHolderLabel、
*/
- (void)setupplaceholderLabel{
UILabel *placeHolderLabel = [[UILabel alloc] init];
placeHolderLabel.text = @"请在此输入备注内容,最多30个字";
placeHolderLabel.numberOfLines = 0;
placeHolderLabel.textColor = KGetColor(200, 200, 200);
[placeHolderLabel sizeToFit];
[self.remarkTextView addSubview:placeHolderLabel];
placeHolderLabel.font = KGetSystemFont(15.f);
[self.remarkTextView setValue:placeHolderLabel forKey:@"_placeholderLabel"];
}
实现的效果如下:
Simulator Screen Shot - iPhone 7 Plus - 2018-11-21 at 09.53.07.png
以下也是常用的方法:
- 方法一:
1.把UITextView的text属性当成“placeholder”使用。
2.在开始编辑的代理方法里清除“placeholder”。
3.在结束编辑的代理方法里根据条件设置“placeholder”。
- 方法二:
1.创建textView
2.给textView添加一个UILabel子控件,作为placeholder
3.在文本改变的代理方法里面显示/隐藏UILabel
- 方法三:
1.自定义UITextView
2.给UITextView添加placeholder和placeholderColor属性
3.重写initWithFrame方法
4.添加通知监听文字改变
5.重写drawRect:方法
6.重写相关属性的set方法
- 方法四:
1.自定义UITextView
2.给UITextView添加placeholder和placeholderColor属性
3.重写initWithFrame方法
4.重写drawRect:方法
5.重写相关属性的set方法
网友评论