如何在 HStack
中水平居中 View
(Image
)?我希望按钮左对齐并且图像在 View 中水平居中。
目前我有这样的结构:
VStack {
HStack {
Button(action: {
print("Tapped")
}, label: {
Image("left-arrow")
.resizable()
.frame(width: 30, height: 30, alignment: .leading)
}).padding(.leading, 20)
Spacer()
Image("twitter-logo")
.resizable()
.frame(width: 30, height: 30, alignment: .center)
}
Spacer()
}
这给了我这个:
但我想实现这个:
最佳答案
您可以在 ZStack
中嵌入两个 HStack
,并根据水平间距放置相应的垫片。使用 Spacer()
将所有内容嵌入到 VStack
中,将所有内容推到顶部。
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:感谢评论中的@Chris Prince,我决定制作一个简单的导航栏式自定义 View ,您可以提供左、中、右参数来创建OP所需的效果(其中每组 View 彼此独立对齐):
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()
}
}
}
关于ios - SwiftUI 中水平居中 View ,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56462647/