最近在使用textView显示富文本,需求是实现部分文字显示不同颜色,支持点击链接跳转,支持动态高度。
部分文字显示不同颜色
[attStr addAttribute:NSForegroundColorAttributeName value:COLOR(66, 140, 241, 1) range:self.productRange];
添加链接
[attStr addAttribute:NSLinkAttributeName value:model.url range:self.productRange]; self.contentLabel.linkTextAttributes = @{NSForegroundColorAttributeName:COLOR(66, 140, 241, 1)}; // 修改可点击文字的颜色
//实现代理方法,return yes 会使用safari打开链接
-(BOOL)textView:(UITextView *)textView shouldInteractWithURL:(NSURL *)URL inRange:(NSRange)characterRange {
if (characterRange.location == self.productRange.location) {
//自定义动作
}
return NO;
}
回到标题内容,计算textView内容高度
相信大家都会计算label的多行文字高度,textView的用法也一样,boundingRectWithSize
CGSize size = [self.contentLabel.attributedText.string boundingRectWithSize:CGSizeMake(Size(270) - 2 * leftPadding, MAXFLOAT) options:NSStringDrawingUsesLineFragmentOrigin attributes:@{NSFontAttributeName:[UIFont systemFontOfSize:Size(14)]} context:nil].size;
但是在textView显示多行文字时,用以上方法会出现最后一行显示不全,也就是计算的高度不对,通过视图工具可以看见textContainer的高度是比textView的高度要大的,由于每一行开头结尾textView都会有padding,导致计算高度时的参数----计算的宽度比实际宽度要大,计算出来的高度也就要小一些,因此传入的宽度要减去两边的padding
解决方案:boundingRectWithSize 中的宽度减去两边的padding
CGFloat leftPadding = self.contentLabel.textContainer.lineFragmentPadding;