我有一个NSLayoutManager,它使用以下代码绘制文本:

[[self textLayoutManager] drawGlyphsForGlyphRange: NSMakeRange(0, [[self text] length])
                                          atPoint: textFrame.origin];

在我看来是-drawRect:。这非常好,但是我真正想做的是逐个字符地对文本进行动画处理,就像正在键入一样。

我试图将字符追加到“可见字符串”变量中,然后调用-[self setNeedsDisplay],但是当处理大约20个字符以上的文本时,它开始滞后,因为每次都会重绘所有文本。

回归:如何为NSLayoutManager-drawGlyphsForGlyphRange:atPoint:设置动画?

最佳答案

(免责声明:我对新的API并没有太多的经验,所以这主要来自以前的文本渲染经验。)

您的主要性能下降将来自于全面更改布局管理器正在使用的文本。即使您只是添加文本,替换它使用的文本也会导致它放弃所有布局计算-间距,所需的字形,实际上将这些字形读入RAM,应用属性等-并重新开始,很快变得非常昂贵。就实际的NSLayoutManager而言,这是“使布局无效”。

我想到了一些潜在的解决方案。您可以子类化NSLayoutManager(“您可以创建NSLayoutManager的子类来处理其他文本属性,无论是否固有。”)并覆盖showCGGlyphs:positions:count:font:matrix:attributes:inContext:以逐渐忽略某些字形(从而使原始文本保持原样)。另一种方法是准确模拟在本机容器中输入文本时发生的情况-使用可变的文本存储,并逐个字符附加所需的文本,以便反复进行文本计算。

如果仅靠这些仍然不能提供出色的性能,请考虑结合使用这些技术和一些本机文本视图;尽管现在不像过去的SDK那样正确,但是不可编辑的UITextViewUILabel(分别用于可变和不可变的文本)包含的优化远远超出了我们凡人所能理解的范围。

关于ios - 制作NSLayoutManager动画,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/20316834/

10-11 20:08