我的问题是:我在 iOS 应用程序(例如 twits - 虽然这不是 Twitter 应用程序)中有动态内容,其中包括文本和图像(主要是图标/表情符号和缩略图)。我想在表格行中同时呈现文本和图像。这里的主要困难是每一行都有不同的大小(使缓存更难),我需要动态计算图像大小以在每个图像出现时适应文本(我可以有 20 个表情符号一个挨一个 + 文本 + 更多表情符号+等)。
我一直在环顾四周,并尝试了几种方法。我最初的想法是使用 UIWebView。我能够创建一个每行一个 UIWebView 的示例应用程序,即使使用一些“智能” NSCache 来预渲染单元格,性能也不是很好,而且我必须处理 UIWebView javascript 回调来确定内容何时正确加载.
我的第二次尝试是为新的 UITableViewCell 覆盖 drawRect。在 drawRect 方法中,我使用 NSAttributedString 和 NSSelectorFromString 来设置每种内容的范围(常规文本、粗体、斜体、不同颜色、图像)。为了适应图像,我使用了 CTRunDelegateCallbacks 回调(getAscent、getDescent、getWidth)。像这样的东西:
CTRunDelegateCallbacks callbacks;
callbacks.version = kCTRunDelegateVersion1;
callbacks.getAscent = ascentCallback;
callbacks.getDescent = descentCallback;
callbacks.getWidth = widthCallback;
CTRunDelegateRef delegate = CTRunDelegateCreate(&callbacks, (__bridge void *)imgAttr); // img Attr is a Dictionary with all image info
有关此方法的更多详细信息,请查看这篇出色的帖子:http ://www.raywenderlich.com/4147/how-to-create-a-simple-magazine-app-with-core-text#
最后,两个问题:
这是最好的方法吗,我可以用良好的性能做到这一点吗?我想知道是否必须为每个滚动的每个单元格调用 drawRect 不会很麻烦 - 有什么我可以提前做的吗?我已经玩了一段时间了,它仍然有很大的滞后 - 但我还没有尝试将每一行缓存在一个单独的线程中并在 cellForRowAtIndexPath 中使用它(尽管这可能会超过内存使用);
我无法找出获取每个 tableview 单元格的行高的最佳方法。在 NSAttributedString 正确处理我的所有内容后,我如何知道我的 drawRect 函数使用的高度?
--- 添加更多信息
在我的 drawRect 创建所有内容(字符串和图像)之后,我尝试使用 boundingRectWithSize 来获得正确的高度:
CGRect frame = [self.attString boundingRectWithSize:CGSizeMake(320, 10000) options:NSStringDrawingUsesLineFragmentOrigin | NSStringDrawingUsesFontLeading | NSStringDrawingUsesDeviceMetrics context:nil];
如果它只是文本,这很好用,但是当我将图像字形添加到内容时,它不会正确计算高度......