您可以在ZStack 中嵌入两个HStack,并为水平间距放置相应的垫片。将所有内容嵌入到 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 和 Spacer() 以按照 OP 的要求将所有内容移到顶部。
编辑 2:删除了图像上的填充,因为它导致图像从中心略微偏移。由于它在自己的HStack 中并且居中对齐,因此不需要填充。
编辑 3:感谢 cmets 中的@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()
}
}
}