需求:用UITextView作为输入框,没有输入或输入一行以内的时候,textView的高度是一行的高度,随着输入内容的增加,textview的高度也跟着增加,但高度最大是能显示3行的高度,然后textview内部滚动显示。另外,textview可控制文字的行间距。
1、textView的设置
重点是textContainerInset和textContainer.lineFragmentPadding的设置,查看sdk说明文档,textContainerInset的默认值是(8, 0, 8, 0),textContainer.lineFragmentPadding的默认值是5,这里为了方便计算,统一设为0,去掉textView里文字区域四周的空隙
- (UITextView *)textView {
if (!_textView) {
_textView = [[UITextView alloc] init];
_textView.font = [UIFont systemFontOfSize:14];
_textView.textColor = kAppearanceColor([UIColor colorWithHex:0x4D4D4D], [UIColor colorWithHex:0xE6E6E6]);
_textView.tintColor = [UIColor colorWithHex:0x7147FF];
_textView.returnKeyType = UIReturnKeySend;
_textView.backgroundColor = [UIColor clearColor];
_textView.delegate = self;
_textView.textContainerInset = UIEdgeInsetsMake(0, 0, 0, 0);
_textView.textContainer.lineFragmentPadding = 0;
self.placeHolderLabel = [[UILabel alloc] init];
self.placeHolderLabel.numberOfLines = 1;
self.placeHolderLabel.font = [UIFont systemFontOfSize:14];
self.placeHolderLabel.textColor= [UIColor colorWithHex:0x999999];
[_textView addSubview:self.placeHolderLabel];
[_textView setValue:self.placeHolderLabel forKey:@"_placeholderLabel"];
}
return _textView;
}
2、textView的布局
[self.contentView addSubview:self.textView];
[self.textView mas_makeConstraints:^(MASConstraintMaker *make) {
make.left.mas_equalTo(weakSelf.textBgView.mas_left).mas_offset(14);
make.right.mas_equalTo(weakSelf.textBgView.mas_right).mas_offset(-14);
make.top.mas_equalTo(weakSelf.textBgView.mas_top).mas_offset(9);
make.bottom.mas_equalTo(weakSelf.textBgView.mas_bottom).mas_offset(-9);
}];
3、输入时动态计算和调整高度
- (void)textViewDidChange:(UITextView *)textView {
textView.attributedText = [[NSAttributedString alloc] initWithString:textView.text attributes:[self attributes]];
CGFloat oldHeight = CGRectGetHeight(self.textBgView.frame);
CGFloat height = [self calculateTextBgHeight:textView.text];
if (fabs(height - oldHeight)>0.01) {
[self.contentView mas_updateConstraints:^(MASConstraintMaker *make) {
make.height.mas_equalTo(height + 10*2);
}];
}
}
- (CGFloat)calculateTextBgHeight:(NSString *)content {
NSAttributedString *attributedText = [[NSAttributedString alloc] initWithString:content attributes:[self attributes]];
CGFloat maxWidth = kDeviceWidth - 87 - 76 - self.textView.textContainer.lineFragmentPadding *2;
CGRect rect = [attributedText boundingRectWithSize:CGSizeMake(maxWidth, CGFLOAT_MAX) options:NSStringDrawingUsesLineFragmentOrigin|NSStringDrawingUsesFontLeading context:nil];
CGFloat textHeight = ceilf(rect.size.height);
CGFloat height = textHeight + 9*2;
return MIN(MAX(height, 38), 78);
}
- (NSDictionary *)attributes {
NSMutableParagraphStyle *paragraphStyle = [[NSMutableParagraphStyle alloc] init];
paragraphStyle.lineHeightMultiple = 1.14;
return @{NSFontAttributeName:[UIFont systemFontOfSize:14],
NSParagraphStyleAttributeName: paragraphStyle
};
}
参考资料
https://blog.csdn.net/weixin_33946605/article/details/91941424
https://www.jianshu.com/p/1d7d8cf9b1fe
https://www.jianshu.com/p/2d9fde661004
https://www.cnblogs.com/wgb1234/p/12449905.html
网友评论