我想在一些文本上绘制两个不同的阴影以创建浮雕效果。这是我的 drawInRect
的一部分,我用第一个阴影绘制文本(所有使用的变量都已定义):
CGContextSetShadowWithColor(context, textInnerShadowOffset, textInnerShadowBlurRadius, textInnerShadowColor.CGColor);
[textColor setFill];
[self.text drawInRect:rect withFont:self.font lineBreakMode:self.lineBreakMode alignment:self.textAlignment];
但是现在我面临着绘制第二个影子的问题。我假设我需要更改阴影并再次绘制文本,但我需要这样做而不添加文本的另一个副本。
如何在不真正绘制文本本身的情况下绘制文本?将填充颜色更改为 clearColor
不起作用。我见过有人为此使用剪贴蒙版,但 AFAICT 只适用于简单的形状,不适用于文本。
或者,有没有更简单的方法在同一文本上绘制两个阴影?
最佳答案
两个选项,具体取决于您想要的确切效果:
如果您希望第一个“上”阴影也有助于其下方的第二个“下”阴影,请使用 transparency layer .
- 为“下方”阴影设置 CGContext 的阴影
- 使用
CGContextBeginTransparencyLayer
创建透明层 - 为“上”阴影设置上下文阴影
- 画出你的文字
- 使用
CGContextEndTransparencyLayer
结束透明层
(请注意,透明层可能非常昂贵。最好调用 CGContextBeginTransparencyLayerWithRect
并传入尽可能小的矩形。)
- 如果您希望阴影是独立的——唯一影响每个阴影的是文本——您需要使用一个技巧。
设置一个额外的大偏移量的阴影,足够大,以便您可以在上下文边界之外绘制文本,并使阴影落在正确的位置。这样您将只能看到阴影,而看不到文本。
- 找出什么偏移量“足够大”。这可能取决于您绘制的上下文的大小(基于您的 View ),也可能取决于文本的边界。 或者,只是捏造它:选择一个大得离谱的值,例如 5000 pt。
- 设置你的影子。将大偏移量添加到其正常的 y 偏移量。
- 绘制文本,垂直偏移大偏移量。
从后到前为每个“下方”阴影重复 1-3。然后,最后绘制文本和“最上面”的阴影,没有偏移。
关于objective-c - 在文本上绘制两个阴影(核心图形),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14114194/