swift - ScrollViewReader 的 proxy.scrollTo 不滚动
问题描述
我有这个 SwiftUI 代码,它构建了一个太大而无法在屏幕上显示的大型 UI 视图,因此我将它放在 2D 滚动视图中。虽然此示例是一个网格,但我们假设内容填充得一样多,但项目的放置更加随机。当视图出现时,我希望它首先将这些项目之一居中,在 ID 为“(25,25)”的项目下方的情况下。这编译得很好,文档看起来很好,并且可以运行,但不会滚动到 ID 为“(25,25)”的 ZStack。为什么它不滚动到这个 ZStack?该代码已在 iOS 14 和 iOS 15b1 上进行了测试。
var body: some View {
ScrollViewReader { scrollView in
ScrollView([.horizontal, .vertical]) {
VStack(alignment: .leading, spacing: 0) {
ForEach(0..<50) { y in
HStack(alignment: .center, spacing: 0) {
ForEach(0..<50) { x in
ZStack {
Circle()
.frame(width: 35, height: 35)
.foregroundColor(.blue.opacity(0.5))
Text("(\(x),\(y)")
.font(.system(size: 8))
}
.offset(x: CGFloat(x * 25), y: CGFloat(y * 25))
.id("(\(x),\(y))")
}
}
}
}
}
.onAppear {
DispatchQueue.main.asyncAfter(deadline: .now() + 3.0) {
scrollView.scrollTo("(25,25)")
}
}
}
}
解决方案
我认为您将偏移误认为是填充,只需填充即可。
看起来不滚动到具有偏移量的视图是一个错误。
从理论上讲,您的代码有一个错误:您在偏移之前向视图添加了一个 ID,因此当您滚动到该 ID 时,它会滚动到视图在偏移之前的位置。
来回切换offset
,id
它应该可以工作(但它不起作用,这让我觉得这里的某个地方存在 SwiftUI 错误)。
推荐阅读
- ruby - Ruby 需要导致未定义的局部变量
- javascript - 更改 Javascript 数组中的对象值
- javascript - 单击时避免菜单切换关闭
- excel-formula - 在 Excel 中格式化科学计数法
- ios - 如何在 UITableViewCell 中删除右填充
- google-cloud-platform - 在到达截止确认时间之前,Google Cloud PubSub 消息多次传递
- java - 模拟器/真实应用程序崩溃,Api$zzf 错误?
- c# - 如何在 Resolver 函数级别使用 GraphQL.NET 实现授权?
- regex - RegEx:确定输入字符串是表达式还是公式调用
- reactjs - getSnapshotBeforeUpdate 使用反应钩子