3

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

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

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

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

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

4

1 回答 1

1

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

  • 如果您希望第一个“上”阴影也有助于第二个“下”阴影,请使用透明层

    1. 为“下”阴影设置 CGContext 的阴影
    2. 使用创建透明层CGContextBeginTransparencyLayer
    3. 为“上”阴影设置上下文的阴影
    4. 画出你的文字
    5. 使用结束透明层CGContextEndTransparencyLayer

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

  • 如果你希望阴影是独立的——对每个阴影有贡献的唯一因素是文本——你需要使用一个技巧。

使用额外的大偏移设置阴影,足够大,以便您可以在上下文边界之外绘制文本并将阴影放置在正确的位置。这样你只会看到阴影,而不是文字。

大偏移的文本和阴影

  1. 弄清楚什么偏移量“足够大”。它可能取决于您正在绘制的上下文的大小(基于您的视图),也可能取决于文本的边界。或者,只是捏造它:选择一个大得离谱的值,比如 5000 pt。
  2. 设置你的影子。将大偏移添加到其正常的 y 偏移。
  3. 绘制文本,垂直偏移大偏移量。

对每个“下”阴影重复 1-3,从后到前。然后,最后绘制文本和“最上面”的阴影,没有偏移。

于 2013-01-01T21:09:14.773 回答