首页 > 解决方案 > 确定列表中行的实际高度

问题描述

我正在尝试确定从行分隔符到行分隔符测量的列表中行的高度。我试图使用 aGeometryReader和 a PreferenceKey。这些给了我相同的答案,即行内容的高度,而不是行本身。

如果我尝试在 上设置 a GeometryReaderForEach()我会得到有趣的副作用,即所有行都堆叠在一起。

我可以通过跟踪每个单元格内容的来源来确定行的高度,但我宁愿没有这种开销,除非有人可以提出一种简单的处理方法。

有什么建议么?

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
    }
}

标签: swiftui

解决方案


推荐阅读