- android - RelativeLayout 背景可绘制重叠内容
- android - 如何链接 cpufeatures lib 以获取 native android 库?
- java - OnItemClickListener 不起作用,但 OnLongItemClickListener 在自定义 ListView 中起作用
- java - Android 文件转字符串
我的问题是:我在 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/
我对 Core Text 的行距一无所知。我正在使用 NSAttributedString 并在其上指定以下属性:- kCTFont属性名称- kCTParagraphStyleAttributeNa
我想显示 3 行 NSAttributedString。有没有办法根据宽度和行数确定所需的高度? 而且我不想创建 UILabel 来进行大小计算,因为我希望计算在后台线程中完成。 最佳答案 我想知道为
我想用另一个 NSAttributedString 替换 NSAttributedString 的子字符串(例如 @"replace")。 我正在寻找与 NSString 的 stringByRepl
我正在尝试在另一个文本中创建多行单独文本以实现以下文本样式。 我已经尝试使用下面的代码来实现目标,但是代码的第三部分产生了一个问题(中等字体) private func createLimit
我有一个 NSAttributedString 并希望在每个 “***” 处拆分它。所以实际上,我想在该字符串出现的任何地方分割一个 NSAttributedString 。结果应该类似于 NSAtt
尝试在 UITextView 中使用 NSAttributedString 显示上标/下标文本在 iOS13 中似乎已损坏 - 除非有人知道否则? 奇怪的是,如果我使用 UIFont systemFo
尝试在 UITextView 中使用 NSAttributedString 显示上标/下标文本在 iOS13 中似乎已损坏 - 除非有人知道否则? 奇怪的是,如果我使用 UIFont systemFo
我有一个富文本编辑器,用户可以在其中编辑字体、颜色等。模型将此信息作为 NSAttributedString 的实例保存在内存中。当我想存储此信息并写入磁盘时,我通过以下函数将属性字符串转换为 htm
这个问题在这里已经有了答案: Cannot convert value of type NSAttributedString.DocumentAttributeKey to .DocumentRea
我想将一个 html 字符串转换为 NSAttributedString,然后处理该字符串(更改颜色、字体大小、字体系列、背景-、前景色...),然后将字符串转换回来从 NSAttributedStr
为什么 NSAttributedString 不继承 NSString ? NSAttributedString 的父类为 NSObject 为什么? 最佳答案 为什么你希望它是 NSString 的
我们正在调用 NSAttributesString 的 initWithRTFD 将 NSData 转换为 attributedString。从 NSTextView 中,我们读取字符串并将其转换为
我想为标签设置样式。没有什么疯狂的,只是一些颜色,改变特定单词的字体大小,等等。我可以用 NSAttributedString 做到这一点,但是在 iOS 7 新引入的 TextKit 中这样做可能/
我正在尝试使用 RTFDFromRange 方法将 NSAttributedString 转换为 NSData。得到这个: No visible @interface for 'NSAttribute
有什么方法可以连接两个 NSAttributedString 吗?或者 NSAttributedString 和 NSString ?我尝试过这样的事情: NSAttributedString *at
有没有人知道那里有任何代码可以让我阅读包含 NSAttributedString 中的图像的 RTF? 是的,我知道有 RTFD 格式和 initWithRTF 方法...但是 initWithRTF
我正在使用 drawGlyphsForGlyphRange渲染 NSAttributedString (在 NSView drawRect 中) 有什么方法可以默认 NSAttributedStrin
这个问题在这里已经有了答案: How to use NSUnderlineStyle.PatternDot (1 个回答) 4 个月前关闭。 我有以下代码尝试为标签的字符串加下划线。 let attr
我已经花了3个小时来解决这个问题,但是有人知道为什么吗?请帮我! 下面的代码将图像添加为属性字符串的附件, UIImage *img = [UIImage imageNamed:imgName]; N
我有一个本地化的字符串: "%@ some text" = "%@ some text"; 格式说明符%@可以出现在本地化字符串中的任何位置。 问题是这个字符串应该是一个NSAttributedStr
我是一名优秀的程序员,十分优秀!