根据屏幕宽度制作2x2网格

时间:2019-10-19 08:51:49

标签: swiftui

很抱歉,如果这是一个简单的问题,但是我只是从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))
    }

2 个答案:

答案 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)

我发现结合使用HStackVStackaspectRatio(_ 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)
    }
}

产生这样的布局:

2x2 grid