编辑:代码样例中10的虚线大小是任意的.仪表板的尺寸是看起来合适的.
假设在SwiftUI中,您希望拥有一个带有虚线轮廓的定制列表项--作为"添加项提示".
因此,您可以使用如下所示的笔划边界:
struct ContentView: View {
let items:[String] = ["a","b","c"]
@State var itemsEmpty = false
var body: some View {
Text("toggle").onTapGesture {
itemsEmpty.toggle()
}
VStack {
Spacer()
if !itemsEmpty {
List{
ForEach(items, id: \.self) {item in
Text(item)
}
}
} else {
// The "list item hint" view
List{
Text("ADD")
.listRowBackground(
RoundedRectangle(cornerSize: CGSize(width: 15, height: 15))
.strokeBorder(style: StrokeStyle(lineWidth: 4, dash: [10]))
)
}
}
Spacer()
}
.padding()
}
}
这导致了以下结果:
在this Apple sample中也使用了同样的技术,但我对此并不满意,因为行(可以理解)不均匀分布,并且在回绕点处会出现严重的截断.
我能想到的解决这个问题的唯一(也不令人满意的)方法是:
A)改为使用两个镜像形状创建视图...(但这仍将导致截断...只是这一次将是对称截断).
B)制作某种"太阳射线"的径向渐变,将两个圆角矩形叠加在一起,给人一种虚线轮廓的错觉……(但这些线的"头和尾"不会垂直于轮廓路径,因为"太阳光"都是从一个点发出的)
C)将参数方程用于一个螺旋(Squircle,因为如果一个超椭圆是矩形的,它看起来就像垃圾一样)(它需要被切成两半,像豪华轿车一样拉伸),并从它创建一条路径,然后使用t=2*(Pi)/某个除数沿着该路径将虚线绘制为间歇线,以建立分辨率.这样做的问题是,修改后的形状将是一个分段函数,因此不能由t驱动.而且,即使它可以驱动,虚线的大小也不会规则,原因很明显,我无法用语言来表达.
怎么才能做到这一点呢?