使用GeometryReader调整窗口大小时在SwiftUI中调整矩形网格的大小
我正在编写一个SwiftUI视图,作为无限网格单元中的视口。我希望视图中显示的行数和列数取决于窗口的大小(这是一个mac应用程序)使用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
当我使用硬编码的行数和列数(例如,
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
的超负荷占用了一个范围,但希望该范围随时间保持不变,可能是出于性能原因。