我有一个NSLayoutManager,它使用以下代码绘制文本:
[[self textLayoutManager] drawGlyphsForGlyphRange: NSMakeRange(0, [[self text] length])
atPoint: textFrame.origin]; 在我看来是-drawRect:。这是很好的工作,但我真正想要做的是动画的文字,一个字符,就像它是被键入。
我试图将字符添加到“可见字符串”变量中,然后调用-[self setNeedsDisplay],但是当处理超过20个字符的文本时,它开始滞后,因为每次都会重新绘制所有文本。
回归:如何动画NSLayoutManager的-drawGlyphsForGlyphRange:atPoint:
发布于 2013-12-01 21:49:15
(免责声明:我对新API没有太多的经验,所以这主要来自于以前文本呈现的经验。)
您的主要减速将来自于对布局管理器正在使用的文本进行全面更改。即使你只是在附加文本,替换它所使用的文本也会导致它扔掉所有的布局计算--间距,所需的符号,实际上将这些符号读入RAM中,应用属性等等--然后重新开始,这很快就会变得非常昂贵。就实际的NSLayoutManager而言,这是“使布局无效”。
我从头顶上看到了一些潜在的解决方案。您可以将NSLayoutManager子类(“您可以创建一个NSLayoutManager子类来处理其他文本属性,无论它是否固有”)。并重写showCGGlyphs:positions:count:font:matrix:attributes:inContext:以逐步忽略某些符号(从而保留它使用的原始文本完整)。另一种方法是准确地模拟在本机容器中输入文本时所发生的事情--使用可变文本存储,并逐个添加所需的文本字符,这样文本计算就可以迭代完成。
如果仅仅这些人仍然没有很好的性能,那么考虑将这些技术与一些本机文本视图结合使用;尽管现在这种情况不如过去的SDKs那样真实,但不可编辑的UITextView或UILabel (分别用于可变的和不变的文本)所包含的优化远远超过我们一般人所能理解的。
https://stackoverflow.com/questions/20316834
复制相似问题