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有没有办法不在函数中显式定义路径?如中所示,我可以让边框适应它所应用到的任何视图的形状吗?对,但我不只是想删除边框,我想让它沿着它所附着的视图的曲线,如果这样做有意义的话,这并不能回答这个问题。若要评论或要求作者澄清,请在其帖子下方留下评论-