您可以在 a 中嵌入两个HStack
'sZStack
并相应地放置垫片以用于水平间距。将所有内容嵌入到 a 中VStack
,Spacer()
以将所有内容推到顶部。
struct ContentView : View {
var buttonSize: Length = 30
var body: some View {
VStack {
ZStack {
HStack {
Button(action: {
}, label: {
Image(systemName: "star")
.resizable()
.frame(width: CGFloat(30), height: CGFloat(30), alignment: .leading)
}).padding(.leading, CGFloat(20))
Spacer()
}
HStack {
Image(systemName: "star")
.resizable()
.frame(width: CGFloat(30), height: CGFloat(30), alignment: .center)
}
}
Spacer()
}
}
}
注意:在第二个HStack
中,图像应该自动居中对齐,但如果不是,您可以Spacer()
在图像前后放置一个。
编辑:添加VStack
andSpacer()
将所有内容移到顶部,就像 OP 想要的那样。
编辑 2:删除了图像上的填充,因为它导致图像从中心略微偏移。由于它是独立的HStack
并且居中对齐,因此不需要填充。
编辑 3:感谢评论中的@Chris Prince,我决定制作一个简单的 NavigationBar 式自定义视图,您可以提供左、中和右参数来创建 OP 所需的效果(每组视图对齐彼此独立):
struct CustomNavBar<Left, Center, Right>: View where Left: View, Center: View, Right: View {
let left: () -> Left
let center: () -> Center
let right: () -> Right
init(@ViewBuilder left: @escaping () -> Left, @ViewBuilder center: @escaping () -> Center, @ViewBuilder right: @escaping () -> Right) {
self.left = left
self.center = center
self.right = right
}
var body: some View {
ZStack {
HStack {
left()
Spacer()
}
center()
HStack {
Spacer()
right()
}
}
}
}
用法:
struct ContentView: View {
let buttonSize: CGFloat = 30
var body: some View {
VStack {
CustomNavBar(left: {
Button(action: {
print("Tapped")
}, label: {
Image(systemName: "star")
.resizable()
.frame(width: self.buttonSize, height: self.buttonSize, alignment: .leading)
}).padding()
}, center: {
Image(systemName: "star")
.resizable()
.frame(width: 30, height: 30, alignment: .center)
}, right: {
HStack {
Text("Long text here")
Image(systemName: "star")
.resizable()
.frame(width: 30, height: 30, alignment: .center)
.padding(.trailing)
}.foregroundColor(.red)
})
Spacer()
Text("Normal Content")
Spacer()
}
}
}
