【发布时间】:2020-04-26 14:16:45
【问题描述】:
我正在尝试为两个形状添加一个遮罩,以便第二个形状遮盖第一个形状。如果我执行Circle().mask(Circle().offset(…)) 之类的操作,则会产生相反的效果:防止第一个圆圈之外的任何内容可见。
UIView 的答案在这里:iOS invert mask in drawRect
但是,尝试在 SwiftUI 中实现这一点没有 UIView 让我望而却步。我尝试实现一个 InvertedShape,然后我可以将其用作掩码:
struct InvertedShape<OriginalType: Shape>: Shape {
let originalShape: OriginalType
func path(in rect: CGRect) -> Path {
let mutableOriginal = originalShape.path(in: rect).cgPath.mutableCopy()!
mutableOriginal.addPath(Path(rect).cgPath)
return Path(mutableOriginal)
.evenOddFillRule()
}
}
不幸的是,SwiftUI 路径没有addPath(Path)(因为它们是不可变的)或evenOddFillRule()。您可以访问路径的 CGPath 并制作可变副本,然后添加两个路径,但是,evenOddFillRule 需要在 CGLayer 上设置,而不是 CGPath。所以除非我能到达 CGLayer,否则我不确定如何继续。
这是 Swift 5。
【问题讨论】:
-
SwiftUI 路径 do 具有 addPath(Path) 以及奇偶填充规则,请参见下面我的答案。
-
@Asperi 我可以发誓我检查了 addPath,我想我有一个不可变的副本出于某种原因......
-
@Asperi 看起来像
Paths 没有填充规则,但Shapes 有。 -
在 SwiftUI 路径中'是一个'形状。
-
类似问题已经回答here: - Inverted mask swiftui with system image