Swift 改变特定边上有边框的功能,以适应拐角半径?

Swift 改变特定边上有边框的功能,以适应拐角半径?,swift,swiftui,border,Swift,Swiftui,Border,所以我有下面的结构和视图扩展,可以添加到任何视图中,如何修复下图中视图的角点 extension View { func border(width: CGFloat, edges: [Edge], color: Color) -> some View { overlay(EdgeBorder(width: width, edges: edges).foregroundColor(color)) } } struct EdgeBorder: Shape {

所以我有下面的结构和视图扩展,可以添加到任何视图中,如何修复下图中视图的角点

extension View {
    func border(width: CGFloat, edges: [Edge], color: Color) -> some View {
        overlay(EdgeBorder(width: width, edges: edges).foregroundColor(color))
    }
}

struct EdgeBorder: Shape {

    var width: CGFloat
    var edges: [Edge]

    func path(in rect: CGRect) -> Path {
        var path = Path()
        for edge in edges {
            var x: CGFloat {
                switch edge {
                case .top, .bottom, .leading: return rect.minX
                case .trailing: return rect.maxX - width
                }
            }

            var y: CGFloat {
                switch edge {
                case .top, .leading, .trailing: return rect.minY
                case .bottom: return rect.maxY - width
                }
            }

            var w: CGFloat {
                switch edge {
                case .top, .bottom: return rect.width
                case .leading, .trailing: return self.width
                }
            }

            var h: CGFloat {
                switch edge {
                case .top, .bottom: return self.width
                case .leading, .trailing: return rect.height
                }
            }
            path.addPath(Path(CGRect(x: x, y: y, width: w, height: h)))
        }
        return path
    }
}
我尝试将其连接到VStack,如下所示:

VStack {
    // content
}
.clipShape(RoundedRectangle(cornerRadius: 20))
.border(width: 1, edges: [.leading, .bottom, .trailing], color: Color.black)
唯一的问题是它最终看起来像这样:


如评论所述,剪裁不会更改初始矩形的绘制路径。将边框宽度更改为0将删除轮廓矩形。

问题出在您的
边序
形状上。它只支持没有角的边界,只为每条边添加一条线到最终路径。 要解决此问题,请尝试

  • 初始化形状时,再添加一个参数
    cornerRadius

  • 修改算法以创建路径

    c - c
    |   |
    c - c
    
  • 仅当存在两个边时才启用角点

        var width: CGFloat
        var edges: [Edge]
        var cornerRadius: CGFloat
    
        func path(in rect: CGRect) -> Path {
            //1. build new rect
            //2. build corners
            let path = UIBezierPath(roundedRect: newRect, byRoundingCorners: corners, cornerRadii: CGSize(width: cornerRadius, height: cornerRadius))
            return Path(path.cgPath)
        }
    

    我像这样绕着边界看风景

                    layerMinY
                 O ----------- O
      layerMinX  |             | layerMaxX
                 |             |
                 O ----------- O
                   layerMaxY
    
        self.myView.layer.borderWidth = 2
        self.myView.layer.borderColor = UIColor.black.cgColor
        self.myView.clipsToBounds = true
        self.myView.layer.cornerRadius = 10
        self.myView.layer.maskedCorners = [.layerMaxXMinYCorner, 
                                          .layerMaxXMaxYCorner]
    
    看起来像这样:


    剪裁不会更改图形路径。您需要更新您的
    EdgeBorder
    ,以明确地按路径进行取舍。现在它是方形的。@Asperi有没有办法不在函数中显式定义路径?如中所示,我可以让边框适应它所应用到的任何视图的形状吗?对,但我不只是想删除边框,我想让它沿着它所附着的视图的曲线,如果这样做有意义的话,这并不能回答这个问题。若要评论或要求作者澄清,请在其帖子下方留下评论-