很抱歉,如果这是一个简单的问题,但是我只是从SwiftUI开始,我试图找出如何根据屏幕的宽度制作2x2的视图网格。这意味着每个正方形的宽度和高度都等于屏幕的宽度,并且它们以2x2的网格排列,没有填充。
我一直在尝试使用两个HStack,每个HView彼此重叠,但是HStack内部的视图大小似乎决定了HStack的高度。
我尝试排列到2x2网格中的视图代码:
var body: some View {
VStack {
TextField("0", text: $value)
.multilineTextAlignment(.center)
.textFieldStyle(PlainTextFieldStyle())
.font(.system(size: 40, weight: .semibold, design: .rounded))
.border(Color.black)
.padding()
Text(title)
.padding([.leading, .bottom, .trailing])
.font(.system(size: 14, weight: .regular, design: .rounded))
}
.background(Color.green)
.cornerRadius(10)
.overlay(RoundedRectangle(cornerRadius: 10).stroke(Color.black, lineWidth: 5))
}
答案 0 :(得分:1)
这可以使用GeometryReader
来完成:
struct ContentView: View
{
var body: some View
{
GeometryReader
{ geometry in
self.useProxy(geometry)
}
}
func useProxy(_ geometry: GeometryProxy) -> some View
{
let dimension = min(geometry.size.width, geometry.size.height)
return VStack
{
HStack(spacing: 0)
{
Text("Top Left")
.frame(width: dimension / 2, height: dimension / 2)
.border(Color.black)
Text("Top Right")
.frame(width: dimension / 2, height: dimension / 2)
.border(Color.black)
}
HStack(spacing: 0)
{
Text("Bottom Left")
.frame(width: dimension / 2, height: dimension / 2)
.border(Color.black)
Text("Bottom Right")
.frame(width: dimension / 2, height: dimension / 2)
.border(Color.black)
}
}
}
}
观看this WWDC video(的第一部分)以了解SwiftUI的布局系统。
答案 1 :(得分:1)
我发现结合使用HStack
,VStack
和aspectRatio(_ aspectRatio: CGFloat? = nil, contentMode: ContentMode)
的组合最适合于在视图上施加一定比例:
struct ContentView: View {
var body: some View {
VStack(spacing: 0) {
HStack(spacing: 0) {
Rectangle().fill(Color.red)
.aspectRatio(1.0, contentMode: .fit)
Rectangle().fill(Color.green)
.aspectRatio(1.0, contentMode: .fill)
}
HStack(spacing: 0) {
Rectangle().fill(Color.blue)
.aspectRatio(1.0, contentMode: .fit)
Rectangle().fill(Color.yellow)
.aspectRatio(1.0, contentMode: .fill)
}
}.aspectRatio(contentMode: .fit)
}
}
产生这样的布局: