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

使用GeometryReader调整窗口大小时在SwiftUI中调整矩形网格的大小,swift,macos,swiftui,Swift,Macos,Swiftui,我正在编写一个SwiftUI视图,作为无限网格单元中的视口。我希望视图中显示的行数和列数取决于窗口的大小(这是一个mac应用程序) 当我使用硬编码的行数和列数(例如,ForEach(0..我假设问题在常量ForEach(即基于范围的构造函数)中)编写时。如果要更改视图数,我们应该使用动态ForEach。下面是可能的解决方案。使用Xcode 11.4/macOS 10.15.5测试 var body: some View { GeometryReader { geometry in

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


当我使用硬编码的行数和列数(例如,
ForEach(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)
                    }
                }
            }
        }
    }
}

我假设问题出现在常量
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)
                    }
                }
            }
        }
    }
}

你的代码对我来说非常好。这是一个屏幕截图,请确认我看到的是否正确。我正在运行
macOS Catalina 10.15.4
iPhone 11 pro(13.4.1)
xcode:11.4.1
@MuhandJumah我正在编写一个macOS应用程序而不是iPhone,但我认为我面临的问题可能会出现在iPhone上。如果你旋转它,它应该切换到一个网格,具有相同大小的单元格,但水平方向的单元格比垂直方向的单元格多,但我认为不会。你的代码对我来说非常好。这是一个屏幕截图t、 请确认我看到的是否正确。我正在运行macOS Catalina 10.15.4和iPhone 11 pro(13.4.1)
xcode:11.4.1
@MuhandJumah我正在编写一个macOS应用程序而不是iPhone,但我认为我面临的问题可能会出现在iPhone上。如果你旋转它,它应该切换到一个网格,具有相同大小的单元格,但水平方向的单元格比垂直方向的单元格多,但我认为不会。这是可行的,谢谢!我还必须符合
Int
identification
。一个问题是我现在无法为单元格编制索引,因为它们都是
Int
,值为
0
,所以我所做的是使用原始代码中的范围,但只是将
id:\.self
参数添加到
ForEach
。具体来说,问题是
过多>ForEach
,它接受一个范围,但希望该范围随时间保持不变,可能是出于性能原因。这很有效,谢谢!我还必须使
Int
符合
可识别的
。但一个问题是我现在无法索引单元格,因为它们都是
Int
,值为
0
,所以我所做的是used了原始代码中的范围,但只是将
id:\.self
参数添加到
ForEach
中。具体来说,问题是
ForEach
的超负荷占用了一个范围,但希望该范围随时间保持不变,可能是出于性能原因。