用优雅的方式给 UITextView 添加 placeholder

在项目中我们有时候会有类似意见反馈备注...等功能点,通常都会用 UITextView 去实现,那么就需要一些弱提示,告诉用户输入文本时需要注意哪些问题,由于 UITextView暴露出来的属性是不支持设置placeholder的,但是我们通过runtime可以发现UITextView中有一个叫_placeHolderLabel的私有属性,那么我们就可以用 kvc来访问这个变量。
当然给UITextView设置placeholder有很多种方法,但是通过runtime来实现无非是最合适不过的,首先导入#import #import

通过遍历找到这个私有变量_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方法
- 其他的几种具体实现方法可以看看:https://www.jianshu.com/p/9edb8be75e0b

你可能感兴趣的:(用优雅的方式给 UITextView 添加 placeholder)