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)] 而得到高度,就是这个难搞的问题

阅读 7.4k
1 个回答

首先,你要明白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{}中计算出来,之前在其他文章也说过,你也去留言了,应该看到了

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进