使用GeometryReader调整窗口大小时,在SwiftUI中调整矩形网格的大小

时间:2020-06-10 23:55:59

标签: swift macos swiftui

我正在编写一个SwiftUI视图,以充当无限单元格网格的视口。我希望视图中显示的行数和列数取决于窗口的大小(这是一个Mac应用程序)。

当我用硬编码的行和列数(例如ForEach(0..<10))编写它时,它可以完美地工作。但是,当我切换为使用GeometryReader计算行数和列数时,矩形消失了。

struct ContentView: View {
    let cellSize: CGFloat = 40
    var body: some View {
        GeometryReader { geometry in
            VStack {
                ForEach(0..<Int(geometry.size.height / self.cellSize)) { _ in
                    HStack {
                        ForEach(0..<Int(geometry.size.width / self.cellSize)) { _ in
                            Rectangle()
                                .fill(Color.red)
                        }
                    }
                }
            }
        }
    }
}

1 个答案:

答案 0 :(得分:0)

我认为问题出在常量ForEach中(即,基于范围的构造函数)。如果要更改视图数,则应使用动态ForEach。这是可能的解决方案。已通过Xcode 11.4 / macOS 10.15.5进行测试。

var body: some View {
    GeometryReader { geometry in
        VStack {
            ForEach(Array(repeating: 0, count: 
                    Int(geometry.size.height / self.cellSize)), id: \.self) { _ in
                HStack {
                    ForEach(Array(repeating: 0, count: 
                            Int(geometry.size.width / self.cellSize)), id: \.self) { _ in
                        Rectangle()
                            .fill(Color.red)
                    }
                }
            }
        }
    }
}