ios - SwiftUI 中水平居中 View

标签 ios swift xcode user-interface swiftui

如何在 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()
    }

这给了我这个:

enter image description here

但我想实现这个:

enter image description here

最佳答案

您可以在 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()图片。

编辑:添加了VStackSpacer()以将所有内容移动到顶部,就像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()
        }
    }
}

Example code shown on simulator

关于ios - SwiftUI 中水平居中 View ,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56462647/

相关文章:

Swift TableView Cell - 显示事件微调器、执行函数、隐藏事件微调器

swift - AV 播放器无法在容器 View Swift 中工作

ios - 截断 UIAlertController 中的文本

ios - viewWillLayoutSubviews 和旋转

ios - 在 Swift 中实例化带有标识符的 View Controller

xcode - 升级到 Xcode 10 后出现问题 : Build input file cannot be found

ios - 导航 Controller swift 中的中心搜索栏

ios - 增加或减少 float

ios - CollectionView navigationController?.pushViewController() 什么都不做,没有错误

ios - 如何自定义我的计时器显示以仅显示分钟和秒?