gpt4 book ai didi

带有一起呈现的动态文本和图像的 iOS UITableView(NSAttributedString + 图像)

转载 作者:可可西里 更新时间:2023-11-01 05:36:25 25 4
gpt4 key购买 nike

我的问题是:我在 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];

如果它只是文本,这工作正常,但是当我将图像字形添加到内容时,它无法正确计算高度...

最佳答案

我遇到了同样的问题,今天解决了。我正在使用 CTRunDelegateCallbacks 在文本之间绘制自定义对象,但是 boundingRectWithSize:options:context: 没有给我正确的高度。 (它忽略了我的自定义对象)。

相反,我在 Core Text 中找到了一个较低级别的 API,它满足所有要求并且完全正确。我为那个问题创建了一个类别。玩得开心! :-)

头文件:

#import <Foundation/Foundation.h>

@interface NSAttributedString (boundsForWidth)

- (CGRect)boundsForWidth:(float)width;

@end

执行文件:

#import "NSAttributedString+boundsForWidth.h"
#import <CoreText/CoreText.h>

@implementation NSAttributedString (boundsForWidth)

- (CGRect)boundsForWidth:(float)width
{
CTFramesetterRef framesetter = CTFramesetterCreateWithAttributedString((CFAttributedStringRef)self);

CGSize maxSize = CGSizeMake(width, 0);

CGSize size = CTFramesetterSuggestFrameSizeWithConstraints(framesetter, CFRangeMake(0, 0), NULL, maxSize, nil);

CFRelease(framesetter);

return CGRectMake(0, 0, ceilf(size.width), ceilf(size.height));
}

@end

关于带有一起呈现的动态文本和图像的 iOS UITableView(NSAttributedString + 图像),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16586190/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com