我在视图中有一个HStack,它应该显示视图内容,所有元素之间都有空格:
import SwiftUI
struct ContentView: View {
var element_1: some View {
Circle()
.frame(width: 50, height: 50)
}
var element_2: some View {
Circle()
.frame(width: 50, height: 50)
}
var element_3: some View {
Circle()
.frame(width: 50, height: 50)
}
var body: some View {
HStack {
Spacer()
element_1
Spacer()
element_2
Spacer()
element_3
Spacer()
}
}
}
其显示了以下内容:
然而,当有更多的视图(Element_1、Element_2、...、Element_7)时,HStack变得有点难以读取,因为HStack中有太多的Spacer()
个,需要进行一些重构:
// Example of having 7 element Views, with 8 spacers in:
HStack {
Spacer()
element_1
Spacer()
element_2
Spacer()
element_3
Spacer()
element_4
Spacer()
element_5
Spacer()
element_6
Spacer()
element_7
Spacer()
}
我曾try 实现一个定制SpacedHStack
来实现相同的输出,以便将HStack减少到
SpacedHStack {
element_1
element_2
element_3
element_4
element_5
element_6
element_7
}
使用以下 struct :
struct SpacedHStack<Content: View>: View {
var views: [Content]
init(@ViewBuilder content: @escaping () -> Content) {
self.views = [content()]
}
var body: some View {
HStack(spacing: 0) {
ForEach(views.indices, id: \.self) { index in
views[index]
if index != views.count - 1 {
Spacer()
}
}
}
}
}
但输出结果与之前的HStack不同,该HStack具有n+1
个间隔符和n
个元素视图:
之前实现的n
个元素的n+1
个间隔物有助于使元素能够根据iPad的任何尺寸进行定位,而设定的长度HStack(spacing: 30){ ... }
是不可行的(不幸的是,没有HStack(spacing: Spacer()) { ... }
这样的东西).然而,由于HStack中有许多Spacer()
‘S,这使得代码更难阅读.在定制SpacedHStack
中可以做什么来获得与先前所做的相同的输出?或者,有没有一种优雅的解决方案来重构HStack,使其不需要定制的SpacedHStack
struct ?