[英]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
完成水平居中 - 您也可以使用带有Spacer
的HStack
来完成:
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.