如何在 SwiftUI 中用另一个形状剪辑一个形状?

Posted

技术标签:

【中文标题】如何在 SwiftUI 中用另一个形状剪辑一个形状?【英文标题】:How can I clip a Shape with another Shape in SwiftUI? 【发布时间】:2021-04-16 14:58:08 【问题描述】:

我想用绿色的半圆夹住红色的正方形。我试过 .mask 和 .clipShape 但是 我不能让它工作。有人可以分享一下它是怎么做的吗?

import SwiftUI

struct TestEndBarView: View 
    var body: some View 
        ZStack 
                Rectangle()
                    .fill(Color.red)
                    .frame(width: 500, height: 500)
                Circle()
                    .trim(from: 0.5, to: 1.0)
                    .fill(Color.green)
                    .rotationEffect(Angle(degrees: 90))
                    .frame(width: 500, height: 500)
                    .offset(x: -250)
                    
        
    


struct TestEndBarView_Previews: PreviewProvider 
    static var previews: some View 
        TestEndBarView()
    

【问题讨论】:

【参考方案1】:

在代码中使用eoFill



struct ContentView: View 

    var body: some View 
        
        CustomShape()
            .fill(Color.purple, style: FillStyle(eoFill: true, antialiased: true))
            .frame(width: 200, height: 200, alignment: .center)
            .shadow(radius: 10.0)
 
    


struct CustomShape: Shape 
    
    func path(in rect: CGRect) -> Path 
        
        return Path  path in
            path.addArc(center: CGPoint(x: rect.minX, y: rect.midY), radius: rect.height/2, startAngle: Angle(degrees: 90), endAngle: Angle(degrees: 270), clockwise: true)
            path.addRect(CGRect(x: rect.minX, y: rect.minY, width: rect.width, height: rect.height))
 
        
        
    

【讨论】:

哦,非常感谢。我也在下面附上了我自己的代码。也许对将来偶然发现这个问题的人也有用。 @AndiAna:我看到了你的代码,你硬编码的值不能重用,你还用线条创建了 Rect,你可以这么容易地使用 Rect! 我将其更改为使用 rect.width 等。。是的,我需要进一步修改形状,并且考虑基本线条有时比形状更容易。【参考方案2】:

创建一个符合Shapestruct

实现func path(in rect: CGRect) -> Path

创建一个Path。添加矩形,然后添加圆形。

将isEOFilled 设置为true 填充形状

【讨论】:

【参考方案3】:

我的代码就是这个基本代码。也许有人觉得这很有用,所以我也附在这里。

import SwiftUI

struct TestEndBarView: View 
    var body: some View 
        ZStack 
            BoxCutOut()
                .foregroundColor(Color.red)
                    
        
    


struct TestEndBarView_Previews: PreviewProvider 
    static var previews: some View 
        TestEndBarView()
    


struct BoxCutOut: Shape 
    func path(in rect: CGRect) -> Path 
        Path  path in
            path.move(to: CGPoint(x:0, y: 0))
            path.addLine(to: CGPoint(x:rect.width, y:0))
            path.addLine(to: CGPoint(x:rect.width, y:rect.height))
            path.addLine(to: CGPoint(x:0, y:rect.height))
            path.addArc(center: CGPoint(x: 0, y: rect.height/2), radius: rect.height/2, startAngle: .degrees(90), endAngle: .degrees(270), clockwise: true )
        
    

【讨论】:

以上是关于如何在 SwiftUI 中用另一个形状剪辑一个形状?的主要内容,如果未能解决你的问题,请参考以下文章

AS3:在影片剪辑中添加形状时未定义术语

如何使用 SVG 形状进行图像剪辑?

SwiftUI |动画此路径形状

如何创建 SwiftUI RoundedStar 形状?

如何剪切/剪辑形状并显示其背后的形状?

可组合成内容形状的剪辑