我想要自动滚动到ScrollView中的特定视图,只需轻触按钮.我知道如何让它与ForEach视图一起工作(在线和堆栈溢出上都有这样的例子),但如果没有ForEach,我就不能让它工作.

下面是它与ForEach一起工作的一个示例:

struct ContentView: View {
    @State private var shouldScrollToBottom = false

    var body: some View {
        ScrollView {
            VStack {
                Button("Scroll to Bottom") {
                    shouldScrollToBottom = true
                }
                .padding()

                ScrollViewReader { scrollViewProxy in
                    LazyVStack {
                        ForEach(0..<50) { index in
                            Text("Item \(index)")
                                .frame(width: 200, height: 50)
                                .background(Color.blue)
                                .cornerRadius(10)
                                .padding()
                                .id(index)
                        }
                    }
                    .onChange(of: shouldScrollToBottom) { scrollToBottom in
                        if scrollToBottom {
                            withAnimation {
                                scrollViewProxy.scrollTo(49, anchor: .bottom)
                            }
                            shouldScrollToBottom = false
                        }
                    }
                }
            }
        }
    }
}

这个代码起作用了.

但我想使用个人视图(而不是ForEach).

下面是一个例子:

struct ContentView: View {


    var body: some View {

        VStack {
            ScrollView {

                Button("Scroll to view 4") {

                }
                .padding()

                VStack {
                    Divider()
                    View1()
                    Divider()
                }

                VStack {
                    Divider()
                    View2()
                    Divider()
                }

                VStack {
                    Divider()
                    View3()
                    Divider()
                }

                VStack {
                    Divider()
                    View4()
                    Divider()
                }

                VStack {
                    Divider()
                    View5()
                    Divider()
                }

            }
        }
    }
}

在此视图中,如何使其在轻按按钮时滚动到视图4?

推荐答案

func scrollTo<ID>(
    _ id: ID,
    anchor: UnitPoint? = nil
) where ID : Hashable

根据苹果公司的文件,id在这里扮演着至关重要的角色.因此,您必须为个人View提供唯一ID,以便ScrollViewReader可以检测并正确滚动到该View.

例如:遵循以下代码以供参考

struct ContentView: View {
    var body: some View {
        ScrollView {
            ScrollViewReader { scrollViewProxy in
                Button("Scroll to Red View") {
                    scrollViewProxy.scrollTo("Red View", anchor: .bottom)
                }
                .padding()
                
                PlaceHolderView(color: .green)
                    .id("Green View")
                
                PlaceHolderView(color: .yellow)
                    .id("Yellow View")
                
                PlaceHolderView(color: .blue)
                    .id("Blue View")
                
                PlaceHolderView(color: .red)
                    .id("Red View")
                
                PlaceHolderView(color: .orange)
                    .id("Orange View")
            }
        }
    }
}

struct PlaceHolderView: View {
    let color: Color
    var body: some View {
        Rectangle()
            .fill(color)
            .frame(height: 350)
    }
}

Ios相关问答推荐

StackView UIKit间距似乎非常小的编程式编程

自定义alert 未执行任何操作

SwiftUI@Observable不跟踪父类属性中的更改以更新视图

如何在SwiftUI中拥有基于操作系统版本的条件修饰符?

如何将Safari调试器附加到Turbo-iOS原生应用中的模拟器

由于已存在同名项目,因此无法将Mapbox.xcframework-ios.sign复制到Signature中

为什么applicationState发布者只发布一次?

在 Swift 项目中使用情节提要加载 obj-c 文件

如何在 SwiftUI 中同时使用 LongPressGesture 和 ScrollView 中的滚动?

expo EAS build (iOS) 在 Pod 安装步骤中失败 (SDK45 & 46)

如何在 SwiftUI 的列表中使用带有 swipeActions 的 NavigationLink

UIImageView 使用 CGAffineTransform 错误旋转

iOS 中的 [Class new] 和 [[Class alloc] init] 有什么区别?

UITableView 背景 colored颜色 在 iPad 上总是白色

所有小部件的Flutter 填充?

如何找出用于构建 *.ipa 文件的配置文件?

NSPredicate 用于测试 NULL 和空白字符串

swift 语言中的 null / nil

从 Swift 转换为 Objective-c 的工具

在 iOS 上没有显示数字键盘