0

在一个巨大的 ScrollView 中,我想放置 Circles,然后滚动到它们,以便在滚动时它们一个接一个地出现在屏幕中间。

我可以使用 .position、.offset 或 .padding 来定位 Circles。我已将它们(300,300)放置在彼此远离的位置,因此当视图加载时它们都不会出现在屏幕上。

当我滚动到使用 .position 或 .offset 定位的位置时,ScrollView 会滚动到左上角。.offset 以插入方式滚动,.position 一直滚动。当我滚动到带有 .padding 的位置时,它没有居中。

我在这里做错了什么?为什么我的三个尝试都不会滚动以使有问题的圆圈位于 ScrollView 的中间?

struct CanvasTester: View {
    
    @State var i = 0
    
    var body: some View {
        ZStack(alignment: .topLeading) {
            ScrollViewReader { scrollView in
                ScrollView([.horizontal, .vertical]) {
                    ZStack(alignment: .topLeading) {
                        Spacer()
                            .frame(width: 4096, height: 4096)
                            .background(Color.yellow)
                            .task {
                                @Sendable func f() {
                                    DispatchQueue.main.asyncAfter(deadline: .now() + 1.0) {
                                        withAnimation {
                                            scrollView.scrollTo("circle\(i+1)", anchor: .center)
                                            self.i = (self.i + 1) % 3
                                        }
                                        f()
                                    }
                                }
                                f()
                            }
                        
                        Circle()
                            .stroke(Color.blue, lineWidth: 4)
                            .frame(width: 44, height: 44)
                            .offset(x: 1500, y: 1500)
                            .id("circle1")

                        Circle()
                            .stroke(Color.green, lineWidth: 4)
                            .frame(width: 44, height: 44)
                            .position(x: 1800, y: 1800)
                            .id("circle2")

                        Circle()
                            .stroke(Color.red, lineWidth: 4)
                            .frame(width: 44, height: 44)
                            .padding([.top, .leading], 2100)
                            .id("circle3")
                    }
                }
            }

            Text("#\(i+1)")

        }
    }
}

快速浏览代码:我有一个 ScrollReader,它封装了一个 ScrollView,它可以双向滚动,大小为 4096x4096。它有一个黄色背景,在绘制时会启动一个函数,该函数每秒滚动到 ID 为“circle1”、“circle2”或“circle3”的视图。然后沿着带有这些标签的三个圆圈,最后是左上角的标签,表示 ID 的颜色编号。

4

0 回答 0