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

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

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

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

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

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

【问题讨论】:

    标签: ios swift uiscrollview swiftui 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 列表对此提供支持。
    猜你喜欢
    • 2020-02-11
    • 2020-10-11
    • 1970-01-01
    • 2020-01-19
    • 1970-01-01
    • 2021-12-24
    • 2014-12-12
    • 1970-01-01
    • 2023-04-07
    相关资源
    最近更新 更多