【问题标题】:SwiftUI: Put List into ScrollView (get List's content height)SwiftUI:将 List 放入 ScrollView(获取 List 的内容高度)
【发布时间】:2021-10-31 19:43:00
【问题描述】:

我正在尝试将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 {
            content
        }
        .introspectTableView { tableView in
            tableView.isScrollEnabled = false
            tableContentHeight = tableView.contentSize.height
        }
        .frame(height: tableContentHeight)
    }
}

我猜这个块并不总是在didLayoutSubviews 或其他东西之后调用,这就是为什么高度有时正确有时错误的原因。所以这是我的问题:我如何可靠地获得List 的高度?我可以在 SwiftUI 中使用类似于 didLayoutSubviews 的远程东西吗?

【问题讨论】:

标签: ios swift uitableview swiftui scrollview


【解决方案1】:

表格contentSize 是根据屏幕上已经出现的单元格计算的。假设剩余单元格的大小将与之前的相同。

您可以看到滚动指示器在滚动时是如何变化的:它可能会根据新单元格的大小而减少或增加。在我的测试中,我使用取决于索引的单元格高度来显示此行为。

introspectTableView 在创建视图时只被调用一次:您可以检查source code

我建议你在这种情况下使用关键路径观察:

struct ContentView: View {
    @State
    private var observation: NSKeyValueObservation?

    var body: some View {
        List {
            ForEach(0..<100) { i in
                Text(String(i))
                    .frame(height: CGFloat(i))
            }
        }.introspectTableView { tableView in
            print("initial size", tableView.contentSize)
            observation = tableView.observe(\.contentSize) { tableView, value in
                print("new size", tableView.contentSize)
            }
        }
    }
}

【讨论】:

  • 天才!非常感谢你!不知道你可以像这样在 SwiftUI 中声明 NSKeyValueObservation
猜你喜欢
  • 1970-01-01
  • 2019-11-05
  • 1970-01-01
  • 2023-02-07
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-03-13
相关资源
最近更新 更多