swiftui - 确定列表中行的实际高度
问题描述
我正在尝试确定从行分隔符到行分隔符测量的列表中行的高度。我试图使用 aGeometryReader
和 a PreferenceKey
。这些给了我相同的答案,即行内容的高度,而不是行本身。
如果我尝试在 上设置 a GeometryReader
,ForEach()
我会得到有趣的副作用,即所有行都堆叠在一起。
我可以通过跟踪每个单元格内容的来源来确定行的高度,但我宁愿没有这种开销,除非有人可以提出一种简单的处理方法。
有什么建议么?
struct ContentView: View {
@State var rowData = RowData.dataArray()
var body: some View {
List {
// GeometryReader { geometry in ***This causes all rows to stack on top of each other
ForEach(rowData) { row in
GeometryReader { rowGeometry in // This gives me the height of the contents of the row, but does not include SwiftUI's padding, etc.
Text(row.text)
.onChange(of: rowGeometry.frame(in: .named("List"))) { newValue in
print("contents height: \(newValue.height)")
}
}
}
.background(GeometryReader {
Color.clear.preference(key: RowHeightKey.self,
value: $0.frame(in: .named("List")).height)
})
.onPreferenceChange(RowHeightKey.self) {
print("preferenceKey: \($0)")
}
}
.coordinateSpace(name: "List")
.background(
GeometryReader { listGeometry in
Color.clear
.onAppear() {
print(listGeometry.size.height)
}
}
)
}
struct RowHeightKey: PreferenceKey {
typealias Value = CGFloat
static var defaultValue = CGFloat.zero
static func reduce(value: inout Value, nextValue: () -> Value) {
value = nextValue()
}
}
}
struct RowData: Identifiable, Hashable {
let id = UUID()
let text: String
let date = Date()
static func dataArray() -> [RowData] {
var rowArray: [RowData] = []
for i in 1...100 {
rowArray.append(RowData(text: "row: \(i.description)"))
}
return rowArray
}
}
解决方案
推荐阅读
- android - FrameLayout 是否应该是不同片段的容器
- nopcommerce - 在 nopCommerce 中为消息模板添加令牌
- r - 如何使用ggplot2摆脱情节顶部的额外空间
- python - NLP-查找包含命名实体的句子数量
- qt - 带有 GUI 的 Qt DLL
- sql - SQL - 将当前行日期值与所有先前行日期进行比较
- java - @tmp 文件夹的目的是什么(用java创建)
- r - 'list' 对象不能被强制输入'double'- R 中的 as.numeric()
- apache-flink - Flink写入空文件
- linux - 命令 'bg' 和 '&' 在 Linux 终端上不起作用