我正在尝试为两个形状添加遮罩,以便第二个形状遮住第一个形状。如果我执行类似的操作Circle().mask(Circle().offset(…)),则会产生相反的效果:防止第一个圆圈外的任何内容可见。
对于UIView答案就在这里:在drawRect中的iOS转化面具
然而,试图实现这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()
}
}
Run Code Online (Sandbox Code Playgroud)
不幸的是,SwiftUI 路径没有addPath(Path)(因为它们是不可变的)或evenOddFillRule(). 您可以访问路径的 CGPath 并制作可变副本,然后添加两个路径,但是,evenOddFillRule需要CGLayer在CGPath.而不是. 所以除非我能到达 CGLayer,否则我不确定如何继续。
这是斯威夫特 5。
我想使用 SwiftUI 实现以下目标:
这是我尝试过的:
Text("test").mask(Rectangle().frame(width: 200, height: 100).foregroundColor(.white))
Run Code Online (Sandbox Code Playgroud)
反之亦然:
Rectangle().frame(width: 200, height: 100).foregroundColor(.white).mask(Text("test"))
Run Code Online (Sandbox Code Playgroud)
这两个样本都给了我想要的相反结果。这意味着只有文本显示为白色,矩形被“屏蔽”。
我也想过替代,我简单地结合起来Text,并Rectangle在ZStack。具有前景色的矩形和具有背景色的文本。这将导致相同的效果。但是我不想这样做,因为这对我来说似乎是一个黑客。例如,如果我想向背景添加渐变或图像,则此方法效果不佳。
在 SwiftUI 中如何做到这一点有什么好方法吗?我不介意它是否通过UIViewRepresentable.