SwiftUI 中的底部优先滚动
Posted
技术标签:
【中文标题】SwiftUI 中的底部优先滚动【英文标题】:Bottom-first scrolling in SwiftUI 【发布时间】:2019-09-25 15:27:35 【问题描述】:如何让 SwiftUI List
从屏幕底部开始滚动(如聊天视图)?
理想情况下,我想模仿,例如列表更新时 iMessage 的行为,这意味着如果用户在底部添加项目,它会向下移动,但如果用户手动向上滚动,它会保持它的位置。
列表是直接从绑定数组中读取的,如果方便的话可以颠倒顺序。
@komal 指出
UITableView
(List
的后端)有一个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 的最底部