SwiftUI 中的底部优先滚动

Posted

技术标签:

【中文标题】SwiftUI 中的底部优先滚动【英文标题】:Bottom-first scrolling in SwiftUI 【发布时间】:2019-09-25 15:27:35 【问题描述】:

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

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

列表是直接从绑定数组中读取的,如果方便的话可以颠倒顺序。

@komal 指出 UITableViewList 的后端)有一个 atScrollPosition 应该提供此功能。但是,如果不将List 完全重新实现为UIViewRepresentable,似乎没有办法访问底层视图,考虑到标准实现是完全黑盒和闭源的,这说起来容易做起来难。

话虽如此,我还发布了Access underlying UITableView from SwiftUI List,如果解决了,可以作为这个问题的答案。

【问题讨论】:

【参考方案1】:

你可以试试这种反转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,但在列表中我没有找到任何隐藏滚动指示器的方法。

希望这会有所帮助。

【讨论】:

ios 14 上使用 UITableView.appearance().showsVerticalScrollIndicator = false 对我来说效果很好。【参考方案2】:

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

【讨论】:

有没有办法让List 做到这一点? (例如,当视图出现时以某种方式访问​​基本 UITableView?) 我已经编辑了我的问题以反映我目前的位置。 我已提交反馈,请求使用 SwiftUI 列表对此提供支持。

以上是关于SwiftUI 中的底部优先滚动的主要内容,如果未能解决你的问题,请参考以下文章

出现键盘时滚动到 SwiftUI Scrollview 的最底部

如何在 Swiftui 的主视图底部的滚动视图中放置一个非粘性按钮? Spacer 在滚动视图中似乎没有效果

如何计算 SwiftUI 中的标签栏高度?

SwiftUI:水平滚动视图我能够上下拉图像

SwiftUI:滚动视图中的顶部锚定可调整大小视图

SwiftUI - 调整 ScrollView 滚动指示器插图