在文本上绘制两个阴影(核心图形)

时间:2013-01-01 21:02:20

标签: objective-c ios core-graphics shadow cgcontext

我想在某些文字上绘制两个不同的阴影来创建浮雕效果。这是我drawInRect中用第一个阴影绘制文本的部分(所有使用的变量都已定义):

CGContextSetShadowWithColor(context, textInnerShadowOffset, textInnerShadowBlurRadius, textInnerShadowColor.CGColor);
[textColor setFill];
[self.text drawInRect:rect withFont:self.font lineBreakMode:self.lineBreakMode alignment:self.textAlignment];

但现在我面临着绘制第二个阴影的问题。我假设我需要更改阴影并再次绘制文本,但我需要这样做而不添加另一个文本副本。

如何在不真正绘制文本的情况下绘制文本?将填充颜色更改为clearColor不起作用。我见过人们使用剪贴蒙版,但AFAICT只能用于简单的形状,而不是文字。

或者,是否有更简单的方法在同一文本上绘制两个阴影?

1 个答案:

答案 0 :(得分:1)

两个选项,具体取决于您想要的确切效果:

  • 如果您希望第一个“上部”阴影也影响其下方的第二个“较低”阴影,请使用transparency layer

    1. 为“较低”阴影设置CGContext的阴影
    2. 使用CGContextBeginTransparencyLayer
    3. 创建透明图层
    4. 为“上部”阴影设置上下文的阴影
    5. 绘制文字
    6. 使用CGContextEndTransparencyLayer
    7. 结束透明层

(请注意,透明层可能非常昂贵。最好调用CGContextBeginTransparencyLayerWithRect并尽可能小地传入。)

  • 如果你想让阴影独立 - 每个阴影唯一有用的就是文字 - 你需要使用一个技巧。

设置具有额外大偏移的阴影,大小足以使您可以在上下文边界之外绘制文本并使阴影落在正确的位置。这样你只会看到阴影,但不能看到文字。

text and shadow with large offset

  1. 弄清楚什么偏移“足够大”。它可能取决于您正在绘制的上下文的大小(基于您的视图),也可能取决于文本的边界。 或者,只是捏造它:选择一个荒谬的大值,如5000磅。
  2. 设置你的影子。将大偏移量添加到其正常y偏移量。
  3. 绘制文本,垂直偏移大偏移。
  4. 对于每个“较低”的阴影,从后到前重复1-3。然后,绘制文本和“最上面”的阴影,不带偏移量。