SwiftUI 中的底部优先滚动

Bottom-first scrolling in SwiftUI

如何使 SwiftUI List 从屏幕底部开始滚动(如聊天视图)?

理想情况下,我想模仿,例如列表更新时 iMessage 的行为,这意味着如果在用户位于底部时添加项目它会向下移动,但如果用户手动向上滚动则保持它的位置。

列表直接从绑定数组中读取,方便的话可以倒序

@komal pointed out that the UITableView (the backend of List) has an atScrollPosition that should provide this functionality. However, there doesn't seem to be a way to access the underlying view without completely reimplementing List as a UIViewRepresentable, which is easier said than done, considering the standard implementation is completely black-boxed and closed-source.

With that said, I've also posted , which, if solved, could serve as an answer to this question.

我建议不要使用 scrollview,而是使用 UITableView,因为 Tablview 继承了 UIScrollview 的滚动 属性。您可以使用 "atScrollPosition:UITableViewScrollPositionBottom" 来实现此行为。

你可以试试这种反转的方法 ScrollView:

struct ContentView: View {
    let degreesToFlip: Double = 180

    var body: some View {
        ScrollView(.vertical, showsIndicators: false) {
            ForEach(0..<100) { i in
                HStack {
                    Spacer()
                    Text("Number: \(i)")
                    Spacer()
                }
                .rotationEffect(.degrees(self.degreesToFlip))
            }
            .rotationEffect(.degrees(self.degreesToFlip))
        }
    }
}

struct ContentView_Previews: PreviewProvider {
    static var previews: some View {
        ContentView()
    }
}

这种方法的问题是你反转了 ScrollView 中的所有内容,所以你也反转了内容,但滚动指示器也会反转,所以指示器现在位于左侧,而不是在右侧边。也许有一些配置总是在右侧显示指示器。

请注意,我在此示例代码中禁用了滚动指示器,这也适用于 List 但在列表中我没有找到任何隐藏滚动指示器的方法。

希望对您有所帮助。