自定义UITextView(OC)

iOS UITextView 属性


有这样一种需求,在UITextView的属性里是没有像UITextFiled一样的占位文字的,那么要让UITextView拥有占位文字,需要什么思路呢?

解决方案如下:

  • 分析:如同UITextField一样,当没有输入时显示占位文字,当有输入时随即消失,当输入完再删除时,又立刻出现
  • 由上分析,可以肯定,这个占位文字我选择一个UILable控件,因为它能够显示文字,而且便于修改占位文字属性
  • 通过分析,用通知或者代理来监听UITextView属性的改变

具体代码如下:

OC代码

@interface TCTextView () <UITextViewDelegate>

@property (nonatomic, strong) UILabel *placeholderLabel;

@end

@implementation TCTextView

- (instancetype)initWithFrame:(CGRect)frame {
    self = [super initWithFrame:frame];
    if (self) {
        [self setupUI];
    }
    return self;
}

#pragma mark - UI 

- (void)setupUI {
    [self addSubview:self.textView];
    [self.textView addSubview:self.placeholderLabel];
    
    // 此处使用了Masonry自动布局,可以替换为计算frame或者其他
    [self.textView mas_makeConstraints:^(MASConstraintMaker *make) {
        make.top.equalTo(self);
        make.bottom.equalTo(self);
        make.left.equalTo(self).offset(18.0);
        make.right.equalTo(self).offset(-18.0);
    }];
    
    [self.placeholderLabel mas_makeConstraints:^(MASConstraintMaker *make) {
        make.top.and.left.equalTo(self.textView).offset(8.0);
    }];

}

#pragma mark - public

- (void)setupTextViewBorderColor:(UIColor *)color borderWidth:(CGFloat)bordWidth {
    if (color != nil) {
        self.textView.layer.borderColor = color.CGColor;
    }
    
    if (bordWidth >= 0) {
        self.textView.layer.borderWidth = bordWidth;
    }
}

#pragma mark - setter

- (void)setPlaceholderLabelText:(NSString *)placeholderLabelText {
    if ([_placeholderLabelText isEqualToString:placeholderLabelText]) {
        return;
    }
    _placeholderLabelText = placeholderLabelText;
    self.placeholderLabel.text = _placeholderLabelText;
}



#pragma mark - UITextViewDelegate

- (void)textViewDidBeginEditing:(UITextView *)textView {
    self.textView.layer.borderColor = COLOR_RGB(29, 169, 158).CGColor;
}

- (void)textViewDidChange:(UITextView *)textView {
    self.placeholderLabel.text = @"";
}

- (void)textViewDidEndEditing:(UITextView *)textView {
    if (textView.text.length > 0) {
        self.placeholderLabel.text = @"";
        return;
    }
    self.placeholderLabel.text = self.placeholderLabelText ?: @"请输入内容(限制50字)";
}

//- (BOOL)textView:(UITextView *)textView shouldChangeTextInRange:(NSRange)range replacementText:(NSString *)text {
//    if ([text isEqualToString:@"\n"]) {
//        [self.textView endEditing:YES];
//        
//        return NO;
//    }
//    return YES;
//}

//- (BOOL)textViewShouldBeginEditing:(UITextView *)textView {
//    
//}


#pragma mark - getter

- (UITextView *)textView {
    if (!_textView) {
        _textView = [[UITextView alloc] init];
        _textView.font = [UIFont systemFontOfSize:20.0];
        _textView.layer.borderColor = COLOR_RGB(224, 224, 224).CGColor;
        _textView.layer.borderWidth = 1.0;
        _textView.layer.cornerRadius = 4.0;
        _textView.delegate = self;
        _textView.textColor = COLOR_RGB(69, 69, 69);
    }
    return _textView;
}

- (UILabel *)placeholderLabel {
    if (!_placeholderLabel) {
        _placeholderLabel = [UILabel tc_createLabelWithTitle:@"请输入内容(限制50字)" font:20.0 color:COLOR_RGB(135, 135, 135) alignment:NSTextAlignmentLeft];
        _placeholderLabel.backgroundColor = [UIColor clearColor];
    }
    return _placeholderLabel;
}

写在最后

TCTextView是继承自UITextView的自定义子类,如果使用,直接创建复制粘贴即可。当然有什么问题,可以留言给我,O(∩_∩)O谢谢!

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
【社区内容提示】社区部分内容疑似由AI辅助生成,浏览时请结合常识与多方信息审慎甄别。
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

相关阅读更多精彩内容

友情链接更多精彩内容