编辑:在代码示例中,虚线长度为10是随意设定的,实际上虚线长度应设置为看起来合适的值。
假设在SwiftUI中,您想要创建一个具有点状轮廓作为“添加项目提示”的自定义列表项。
可以采用如下方式使用.strokeBorder
:
struct ContentView: View {
let items = ["a", "b", "c"]
@State var itemsEmpty = false
var body: some View {
Text("toggle")
.onTapGesture {
itemsEmpty.toggle()
}
VStack {
Spacer()
if !itemsEmpty {
List(items, id: \.self) {item in
Text(item)
}
} else {
// 创建“添加项目提示”视图
List {
Text("ADD")
.listRowBackground(
RoundedRectangle(cornerRadius: 15)
.strokeBorder(style: StrokeStyle(lineWidth: 4, dash: [10]))
)
}
}
Spacer()
}
.padding()
}
}
这段代码会产生以下效果:
https://static.stackoverflow.fun/LApCj.png
这个技术在苹果官方的某个示例应用中有使用,但我对此不满意,因为线条(可以理解地)并未均匀分布,并且在圆角矩形的连接处出现了不美观的截断现象。
我想到的解决方法也都不够理想:
A) 采用两个对称图形来构建视图……(但这仍然会导致截断,只是这次截断会是对称的)。
B) 创造一种类似“太阳光芒”的放射状渐变,并以某种方式堆叠两个圆角矩形,模拟出点状轮廓的效果……(但由于所有“光芒”都从单个中心点发出,这些线条的“起点和终点”将不会与轮廓路径垂直)。
C) 使用squircle(这里选择squircle是因为我认为当superellipse呈矩形时外观较差)的参数方程绘制路径,然后根据t = 2 * (pi) / 某除数确定分辨率,在路径上绘制间歇性线条作为虚线。问题在于,经过拉伸处理后的squircle形状会变成分段函数,因此无法直接通过t变量驱动。即使能够驱动,由于一些显而易见但难以言表的原因,虚线的大小也不会保持一致。
那么,如何才能有效地实现这样一个带有均匀点状轮廓的列表项呢?