1

我有一个自定义drawRect方法的视图,它有两条固定宽度的文本行。该视图以每秒约 16 个计时器的速度不断重绘,文本的位置和文本的内容一直在变化。我还需要以在任何背景下都清晰可见的方式绘制文本,为此我执行以下操作:

CGContextSetTextDrawingMode(ctx, kCGTextStroke);        // Border mode
[string drawAtPoint:point withFont:font];
CGContextSetTextDrawingMode(ctx, kCGTextFill);          // Text mode
[string drawAtPoint:point withFont:font];

此代码以固定线宽的边框模式绘制文本,然后在相同位置再次以填充模式绘制文本。通过这种方式,我得到一个蓝色文本,每个字母周围都有白色边框。

除了性能,结果对我来说绝对令人满意。使用 Time Profiler 我注意到绘制整个视图所花费的时间大约有 70% 用于执行以边框(笔划)模式绘制文本。但是在填充模式下绘制只需要整个视图绘制时间的 3%。考虑到视图重绘的频率,我认为这不是有效的。

那么有人知道如何以更有效的方式在每个字母周围绘制带有边框的文本吗?

4

1 回答 1

4

两种选择:

  1. 使用阴影而不是绘制轮廓:CGContextSetShadowWithColor
  2. 使用 CGLayer 缓存字符串的图像及其轮廓:CGLayerCreateWithContext

2的解释:

绘图文本针对仅用一种颜色填充字母的标准情况进行了高度优化。单个字形(字母)不会每次都从轮廓中呈现。相反,字形只被绘制到缓存和重用的缓冲图像中。

由于很少绘制轮廓,因此此模式可能没有字形缓存或其他优化。所以想法是自己进行缓存:将整个字符串绘制到一个图像中,保留该图像并绘制它而不是从您的drawRect:方法中绘制文本。

有几种方法可以做到这一点:

  1. 使用CGBitmapContext
  2. 利用UIGraphicsBeginImageContext
  3. 用一个CGLayer
于 2012-07-11T23:05:41.550 回答