三种方式实现带有占位符的textView

项目要求, 话不多说, 下面直接开始.


第一种: 在自定义 textView 中添加一个 UILabel

这种可行是可行, 但是没怎么见过人往 imageView 啊, textView 啊, 这种控件上面添加控件的, 感觉很怪~
思路就是添加 label 之后在输入文本的时候隐藏 label, 没有文本的时候显示 label即可.


第二种: 利用消息传递, 关联对象等底层实现占位符

这种比较麻烦, 弱鸡如我并看得不顺畅, 下面甩个链接.
点这里


第三种: 用 drawRect 方法直接画一个 placeholder

这种方法我觉得可行度最高, 没啥难度, 代码最不麻烦.

首先我们新建一个自定义文件继承自UITextView, 然后我们考虑需要修改什么属性, 首先这个自定义控件本身就继承自系统控件, 那么font, textColor这些属性可以直接外部修改就行了, 只需要自己设置占位文字和它的相关属性即可(颜色, 字体等等), 如果想修改光标颜色, 那么可能得用到runtime去用kvc修改系统属性, 具体方法请参考这里, 可以试一下, 不知道可行不.

那么来到.h文件:

#import 

@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];
}

最后上两张效果图:

三种方式实现带有占位符的textView_第1张图片
输入前
三种方式实现带有占位符的textView_第2张图片
输入后

你可能感兴趣的:(三种方式实现带有占位符的textView)