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

标签 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 只适用于简单的形状,不适用于文本。

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

最佳答案

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

  • 如果您希望第一个“上”阴影也有助于其下方的第二个“下”阴影,请使用 transparency layer .

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

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

  • 如果您希望阴影是独立的——唯一影响每个阴影的是文本——您需要使用一个技巧。

设置一个额外的大偏移量的阴影,足够大,以便您可以在上下文边界之外绘制文本,并使阴影落在正确的位置。这样您将只能看到阴影,而看不到文本。

text and shadow with large offset

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

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

关于objective-c - 在文本上绘制两个阴影(核心图形),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14114194/

相关文章:

ios - 如何获取键值并在字典的键中应用条件?

ios - 重新启动 View Controller 后,Swift Tableview 复选标记消失

ios - 查询核心数据中的最大NSDate

cocoa - 用于 View 和 PDF 生成的通用 CoreGraphics 绘图代码应该放在哪里?

iOS:CGAffineTransform Scale 移动我的对象

objective-c - Objective C 库和搜索路径

objective-c - IBOutlets、实例变量和属性 : Best Practices

ios - Mac 音频在 xcode 中的断点处停止时停止

ios - 从当前 View 和推送 View 处理后退按钮

ios - 在 iOS 中捕获签名时出现性能问题