我正在尝试在核心图形中斜切路径。有没有人已经为任意形状做过这个,如果有,他们愿意分享代码吗?
我在下面包含了我的实现。我使用三个变量来确定斜角:CGFloat bevelSize
、UIColor highlightColor
、UIColor shadow
。请注意,光源的角度始终为 135 度。我还没有完成这个实现,但这基本上是我想要做的,分为两部分。第一部分,生成焦点:
- 我找到了路径中每条相邻线之间角度的平分线。
- 对于弧线,平分线是垂直于由弧线的两个端点创建的线的线,起源于中点。这应该考虑到使用弧的大多数情况。我不取圆弧和直线的平分线。在这些情况下,弧平分线应该可以正常工作。
- 然后我根据每个相邻平分线的交点计算焦点。
- 如果焦点在它使用的形状内,否则将被丢弃。
生成焦点的目的是按比例“缩小”形状。
第二部分稍微复杂一些。我必须创建斜面形状的每一边/段。我通过绘制“in”来做到这一点(由bevelSize
) 沿从最近的焦点延伸到相关点的直线半径的原始形状的每个点。当我有两个连续的“bevelPoints”时,我创建了一个 UIBezierPath,它从 bevelPoints 延伸到原始点并返回到 bevelPoints(注意,这包括弧)。这会创建一个我可以用来填充的“边/段”。在直边上,我只是根据边的角度填充阴影或高光颜色。对于弧,我确定弧度“弧”。如果该弧包含过渡角度(M_PI_4 或 M_PI + M_PI_4),我会用渐变填充它(从阴影到高光或从高光到阴影,无论哪种方式都合适)。否则我用纯色填充它。
更新
我已将我的答案(见下文)拆分为单独的博客文章。我不再使用您在上面看到的实现细节,但我将其全部保留以供参考。我希望这可以帮助其他希望使用 Core Graphics 的人。