首页 > UITableViewCell中带有自定义表情图片的UITextView的NSAttributedString的文本高度?

UITableViewCell中带有自定义表情图片的UITextView的NSAttributedString的文本高度?

在一个聊天界面中,计算文字高度:

采用 UITableView

自定义 UITableViewCell,在 Cell中添加了一个 UITextView 用于显示文字,由于要支持显示自定义的表情,如QQ表情,所以用到了NSAttributedString的NSTextAttachment,将自定义表情关键字如[呲牙]替换成图片,然后返回一个新的NSAttributedString赋值给UITextView。

现在的问题是:计算文本高度:用这个方法
- (CGRect)boundingRectWithSize:(CGSize)size options:(NSStringDrawingOptions)options attributes:(NSDictionary *)attributes context:(NSStringDrawingContext *)context
计算高度有偏差,是因为有自定义表情的缘故,如果不用UITextView.NSAttributedString而直接设置UITextView.text,这个方法计算的高度是非常准的。

用这个方法
[textView sizeThatFits:CGSizeMake(textView.bounds.size.width, 5000)] 计算带有NSAttributedString的高度也是非常准的,但是有个问题:

UITableView的计算高度的方法
- (CGFloat)tableView:(UITableView *)tableView heightForRowAtIndexPath:(NSIndexPath *)indexPath
是先于
- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath
调用的,也就是说,我设置数据源的时候还没有创建UITableViewCell,也就不能获取UITableViewCell中的[textView sizeThatFits:CGSizeMake(textView.bounds.size.width, 5000)] 而得到高度,就是这个难搞的问题


首先,你要明白UITableView的执行顺序,就拿:

- (CGFloat)tableView:(UITableView *)tableView heightForRowAtIndexPath:(NSIndexPath *)indexPath{}

- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath{}

来说,先执行heightForRowAtIndexPath(算每行cell的高度只会调用一次,不会随着tableView上下滑动而重复调用),在根据计算好的cell高度,再执行cellForRowAtIndexPath渲染页面.

你现在通过[textView sizeThatFits:CGSizeMake(textView.bounds.size.width, 5000)],能很计算高度的话,你完全可以把每行要显示的数据在- (CGFloat)tableView:(UITableView *)tableView heightForRowAtIndexPath:(NSIndexPath *)indexPath{}中计算出来,之前在其他文章也说过,你也去留言了,应该看到了

【热门文章】
【热门文章】