我試圖將一個List放入ScrollView中。
如果你想知道原因,這里是我的解釋,如果不知道,就跳到代碼部分。我需要在我的List上面有一個平滑縮放的標題。為了做到這一點,我應該把標題和List放在一個ScrollView上,并使用滾動內容的偏移來完成剩下的作業。我還需要禁止List的內置滾動,因為它已經在ScrollView上了,并且固定List的高度--所以滾動視圖知道它的內容高度。它作業得很好,但List的高度有時(!)是錯誤的。
我不能使用 LazyVStack 來代替 List - 它更慢(我猜沒有單元格重用),并且 List 很大。它還會破壞NavigationLinks,所以它被淘汰了 - 它必須是一個List。
單元格的高度不是固定的,所以我不能只是手動計算。
這是我的代碼。
下面是我使用UITableView創建一個高度固定的不可滾動的List的代碼:
struct AutosizingList<Content: View>。View {
@ViewBuilder var content: Content
@State private var tableContentHeight: CGFloat = 0
var body。some View {
List {
內容
}
.inrospectTableView { tableView in
tableView.isScrollEnabled = false
tableContentHeight = tableView.contentSize.height
}
.frame(height: tableContentHeight)
}
}
我猜這個塊并不總是在didLayoutSubviews或其他什么地方被呼叫,這就是為什么高度有時正確,有時錯誤的原因。所以我的問題是:我怎樣才能可靠地獲得List的高度?我可以使用與SwiftUI中的didLayoutSubviews相類似的東西嗎?
uj5u.com熱心網友回復:
表格contentSize是根據已經出現在螢屏上的單元格來計算的。它假定剩余的單元格的大小將與之前的單元格相同。
您可以看到滾動指示器在您滾動時的變化:它可能會根據新單元格的大小而減少或增加。在我的測驗中,我使用了一個取決于索引的單元格高度來顯示這種行為。
反過來introspectTableView在創建視圖時只被呼叫一次:你可以檢查源代碼。
我建議你在這種情況下使用關鍵路徑觀察:
struct ContentView。View {
private var observation: NSKeyValueObservation?
var body。some View {
List {
ForEach(0...</span>100) { i in
Text(String(i))
.frame(高度。CGFloat(i))
}
}.introspectTableView { tableView in.
print("初始尺寸", tableView.contentSize)
觀察 = tableView.observe(.contentSize) { tableView, value in.
print("new size"/span>, tableView.contentSize)
}
}
}
}
轉載請註明出處,本文鏈接:https://www.uj5u.com/qiye/311703.html
標籤:
上一篇:改變表格中第一個單元格的背景影像
