将绘图剪辑到 CAShapeLayer 的不透明(描边)部分

Clip Drawing to Opaque (Stroke) Part of CAShapeLayer

我有一个 CAShapeLayer 具有不透明描边和透明填充。然后我想调用 myContext.drawRadialGradient,但是将这个径向渐变剪辑到我的形状层的笔划。目前,我正在调用 myShapeLayer.path.addClip(),它将径向渐变剪裁到形状层的填充区域,而不是描边。

换句话说,我想使用只是图层的不透明部分只是描边(同样的事情在我的例子中),并用它来剪辑当前上下文。我一直在搜索 CoreGraphics 文档一段时间但无济于事。

找到我的答案。您可以创建一个新的 UIBezierPath,它是现有 UIBezierPath 的副本,带有一笔,如下所示:

let strokePath = UIBezierPath(cgPath: oldPath.cgPath.copy(
    strokingWithWidth: ..., lineCap: ..., lineJoin: ..., miterLimit: ...))
strokePath.addClip()

如果将形状图层添加为渐变图层的蒙版会怎么样?这应该有效,因为这是遮罩层应该做的。

如果这不起作用,您可能需要将形状层捕获到图像并将其安装为渐变层的蒙版。

将描边路径转换为填充区域与原始描边相同的新路径。现在您有一个可填充区域,您可以将其用作剪裁区域。 CGContext 的方法是调用 replacePathWithStrokedPath。正如文档明确所说:

For example, you can clip to the stroked version of a path by calling this function followed by a call to the function clip().