【问题标题】:Animate NSLayoutManager drawing动画 NSLayoutManager 绘图
【发布时间】:2013-12-01 20:26:09
【问题描述】:

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

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

在我看来是-drawRect:。这非常有效,但我真正想做的是将文本动画化,一个字符一个字符,就好像它正在被输入一样。

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

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

【问题讨论】:

    标签: ios objective-c animation textkit nslayoutmanager


    【解决方案1】:

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

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

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

    如果单独使用这些技术仍然没有很好的性能,请考虑将这些技术与一些原生文本视图结合使用;尽管现在这在过去的 SDK 中不太正确,但不可编辑的 UITextViewUILabel(分别用于可变文本和不可变文本)包含的优化远远超出了我们普通人所能理解的范围。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2014-05-12
      • 1970-01-01
      • 2016-07-19
      • 2017-08-10
      • 2019-04-10
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多