在iOS中有效地绘制有边框的文本

时间:2012-07-11 22:56:10

标签: objective-c ios cocoa text border

我有一个自定义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%。考虑到重绘视图的频率,我认为这不是很有效。

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

1 个答案:

答案 0 :(得分:4)

两个选项:

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

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

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

    有多种选择:

    1. 使用CGBitmapContext
    2. 使用UIGraphicsBeginImageContext
    3. 使用CGLayer