我可以使用Core Text绘制富文本,问题是将图像与文本一起流动。 (iOS SDK 4.1)
我正在尝试绘制某种富文本。问题是设计师在文本中放置了许多图标。所以我要绘制的文字是这样的:
Here is a word <an icon image>, and another words. The image(<another icon>) should be placed like a glyph. It's part of text, not an example.
<icon>
是图片。 (这不是代码。只是一个例子。)
我可以通过手动布局所有这些来绘制它,但是保持复杂的文本布局行为太难了。所以我找到了一种用Core Text绘制它的方法。
答案 0 :(得分:9)
我得到了解决方案。
布置非文本内容的关键是CTRunDelegate
。
Core Text
不支持非文字内容,因此您必须为它们制作空格,并稍后绘制或放置它们。
归因于NSAttributedString
的{{1}}的一部分将调用已注册的回调来确定每个字形的宽度。这将允许您为每个非文本对象创建空白区域。
但是,在使用kCTRunDelegateAttributeName
绘制文本后,使用frame / line / run存储的布局信息将无效。所以你必须在使用framesetter / typesetter进行布局之后,但在绘制之前绘制/放置非文本内容。
此链接描述了CTRunDelegate的基本用法:
How to use CTRunDelegate in iPad?
Core Text存在问题。最初,CTRunDelegate旨在通过Core Text
和CTRunDelegateCallbacks.getAscent
支持可变宽度和垂直对齐。但垂直对齐功能目前不起作用。这可能是一个错误。
我在这里描述了这个问题: Aligning multiple sized text vertical center instead of baseline with Core Text in iOS
如果您有关于此问题的信息,请在链接中查看我的问题。
答案 1 :(得分:3)
您只需为给定的CTRun设置委托,委托对象负责让Core Text知道什么是CTRun上升空间,下降空间和宽度。
当Core Text“到达”具有CTRunDelegate的CTRun时,它会询问代表 - 我应该为这块数据留出多少宽度,它应该有多高?这样你就可以在文本中构建一个洞 - 然后你可以在那个位置绘制你的图像。
这是一篇关于Core Text的博客。它有适合你的答案。