繁体   English   中英

如何在 VStack 中水平居中视图

[英]How to horizontally center a view in a VStack

我试图提出这样的观点:

在此处输入图像描述

我有一些代码可以制作一个三角形

struct Triangle: View {

    @State var height: CGFloat = 300
    @State var width: CGFloat = 300

    var body: some View {
        Path { path in
            path.move(to: CGPoint(x: 0, y: 0))
            path.addLine(to: CGPoint(x: width / 2.0, y: height))
            path.addLine(to: CGPoint(x: width, y: 0))
        }
    }
}

struct Triangle_Previews: PreviewProvider {
    static var previews: some View {
        Triangle(height: 200, width: 300)
            .previewLayout(.sizeThatFits)
    }
}

这看起来不错:

在此处输入图像描述

但是,我无法在垂直堆栈中将三角形居中。 我已经注释掉了我失败的尝试。

import SwiftUI

struct AccentView: View {

   //  var proxy: GeometryProxy!

    var body: some View {
        VStack(
         //   alignment: .center,
            spacing: 0
        ) {
            EmphasizeButton()
            Triangle(height: 10, width: 10)
                //.frame(alignment: /*@START_MENU_TOKEN@*/.center/*@END_MENU_TOKEN@*/)
                //.alignmentGuide(.center)
                // .padding([.leading, .trailing])
//                .alignmentGuide(.center, computeValue: {
//                    _ in return -self.proxy.size.width / 2.0
//                })
                .foregroundColor(.green)
        }
    }
}

struct AccentView_Previews: PreviewProvider {
    static var previews: some View {
        AccentView()
    }
}

这是我的结果:

在此处输入图像描述

我认为将Triangle作为Shape并为其定义frame会更好。 现在,它正在扩展以占用可用宽度:

struct Triangle : Shape {
    func path(in rect: CGRect) -> Path {
        Path { path in
            path.move(to: CGPoint(x: 0, y: 0))
            path.addLine(to: CGPoint(x: rect.size.width / 2.0, y: rect.size.height))
            path.addLine(to: CGPoint(x: rect.size.width, y: 0))
        }
    }
}

struct ContentView: View {
    var body: some View {
        VStack(alignment: .center, spacing: 0) {
            Rectangle()
                .foregroundColor(.green)
                .frame(height: 30)
            Triangle().frame(width: 10, height: 10)
            .foregroundColor(.green)
        }
    }
}

使用alignment: .center完成水平居中 - 您也可以使用带有SpacerHStack来完成:

struct ContentView: View {
    var body: some View {
        VStack(spacing: 0) {
            Rectangle()
                .foregroundColor(.green)
                .frame(height: 30)
            HStack {
                Spacer()
                Triangle().frame(width: 10, height: 10)
                    .foregroundColor(.green)
                Spacer()
            }
        }
    }
}

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM