textview计算内容高度

最近在使用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;

你可能感兴趣的:(textview计算内容高度)