swiftui - 如何在 SwiftUI 中创建响应式网格布局?
问题描述
通常的做法是让一些在数组中具有多个属性的数据显示在视口的设备中,即compact
或者wide
(iPhone、iPad、纵向/横向等)。例如,我们可能希望在“portrait compact view”中显示 1 列 2 个项目,或者在“portrait wide view”中显示 1 列和 4 个项目。
代码方面,我们有UserInterfaceSizeClass
, 可以按如下方式使用:
@Environment(\.horizontalSizeClass) var horizontalSizeClass: UserInterfaceSizeClass?
@Environment(\.verticalSizeClass) var verticalSizeClass: UserInterfaceSizeClass?
...
HStack {
if horizontalSizeClass == .compact {
...
} else {
...
}
}
或者,类似于计算ratio
:
GeometryReader { proxy in
if proxy.size.width > 324.0/2.0 {
WideView()
} else {
NarrowView()
}
}
而网格可以理解为一个二维数组,我们可以遍历所需的列数并嵌套在循环中,循环遍历所需的行数。
VStack {
ForEach(0 ..< self.rows, id: \.self) { row in
HStack {
ForEach(0 ..< self.columns, id: \.self) { column in
...
}
}
}
}
我希望这是有意义的,并且可以理解为独立于技术堆栈使用的一些基本原则。
因此,给定一维数据集合列表(请假设有大量行星):
class Planet {
var name: String
var size: Double
init(name:String, size:Double) {
self.name = name
self.size = size
}
}
var planets = [Planet]()
let planet = Planet(name: "Mars", size: 30.5)
planets.append(planet)
数据需要分配给响应网格视图。
那么,考虑到上面公开的数据和不同的视口和设备纵向/横向模式,在 SwiftUI 中创建响应式网格布局的最佳方法是什么?
让知道是否有好的做法来解决这个问题!
解决方案
推荐阅读
- java - JTable 中的水平滚动限制
- javascript - 使菜单图标可从窗帘菜单中单击
- node.js - EACCES:权限被拒绝,rmdir 'build'
- python-3.x - 在 OpenSUSE 上的 Python 中不显示绘图
- python - 将 2 个数据框与检查 id 进行比较,列值在其他数据框列中。如果值在那里,则更改相应的列
- node.js - 用 sinon 和 chai 测试函数时的问题
- xcode - XCode 没有编译文件并冻结系统
- firebase - 如何设置 pubsub 以便 firebase 可以通过云功能 pubsub 触发器接收?
- php - 如果 !empty 多行
- python - 对数据框中的一列求和并将结果返回为 int