美文网首页iOS BlogiOS技术专题程序员
三种方式实现带有占位符的textView

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

作者: Oniityann | 来源:发表于2016-11-29 17:22 被阅读101次

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


第一种: 在自定义 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];
}

最后上两张效果图:

输入前 输入后

相关文章

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

    项目要求, 话不多说, 下面直接开始. 第一种: 在自定义 textView 中添加一个 UILabel 这种可行...

  • 实现带有占位文字的textView

    UITextView默认是不带有占位文字的,如果实现这个功能,大致有两个方法: textView中添加一个labe...

  • UITextView(占位字符,限制字数)

    请关注,防止你用了,我改了,有问题连个商量的人都找不到... 自定义带占位符的TextView 设置占位符方式千奇...

  • Learning iOS D13 2017-11-9(text

    给textView添加占位符 textView没有placeholder属性 若要给它添加placeholder属...

  • 带有占位文字的textView

    输入文本的控件 能输入文本的控件,在ios当中有两个,一个是textField ,一个是 textView。简单分...

  • TextView 相关UI设置

    设置占位符 一个TextView中文字颜色不同

  • android textView 占位符

    在Android布局中进行使用到空格,以便实现文字的对齐。那么在Android中如何表示一个空格呢? 空格:...

  • Android TextView 占位符

  • 莹莹

    占位符占位符占位符占位符占位符占位符占位符占位符占位符占位符占位符占位符占位符占位符占位符占位符占位符占位符占位符...

  • 莹莹

    占位符占位符占位符占位符占位符占位符占位符占位符占位符占位符占位符占位符占位符占位符占位符占位符占位符占位符占位符...

网友评论

    本文标题:三种方式实现带有占位符的textView

    本文链接:https://www.haomeiwen.com/subject/wjfzpttx.html