问题描述
我有这段 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 时,它会滚动到视图在偏移量之前的位置。
切换 class Comp {
doSomething() {
axios.get('http://localhost:8000/wel/')
.then(res => {
this.setState({ details: res.data });
})
.catch(err => {});
}
componentDidMount() {
this.doSomething();
}
componentDidUpdate() {
this.doSomething();
}
}
和 offset
,它应该可以工作(虽然它没有让我认为这里某处存在 SwiftUI 错误)。