我有一个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那样正确,但是不可编辑的UITextView
或UILabel
(分别用于可变和不可变的文本)包含的优化远远超出了我们凡人所能理解的范围。
关于ios - 制作NSLayoutManager动画,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/20316834/