您可以在 SwiftUI 中以编程方式显式设置滚动视图的内容偏移量吗?

如何解决您可以在 SwiftUI 中以编程方式显式设置滚动视图的内容偏移量吗?

是否可以在 UI 的不同级别共享两个滚动视图的内容偏移量?甚至可以在 SwiftUI 中控制滚动视图的内容偏移量吗?我知道 ScrollView 现在可以滚动到特定项目,如果该项目有一个 id,但如果用户与其中一个交互,我希望两个滚动视图一起滚动。我不能为两个部分使用一个滚动的原因是我试图完成一个网格,其中左列和第一行都是粘性的。下面是完成这个网格的代码

struct ContentView: View {
    let rows = Array(repeating: GridItem.init(.fixed(44),spacing: 0),count: 8)
    @State private var scrollViewContentOffset: CGFloat = 0

    var body: some View {
        NavigationView {
            ScrollView {
                Lazyvstack(spacing: 0,pinnedViews: [.sectionHeaders]) {
                    Section(header: gridView()) {
                        HStack(spacing: 0) {
                            firstColumnHeaderView()
                                .frame(width: 95)
                            TrackableScrollView([.horizontal],showsIndicators: false,contentOffset: $scrollViewContentOffset) {
                                LazyHGrid(rows: rows,spacing: 0) {
                                    ForEach(0...55,id: \.self) { index in
                                        GridCell(title: "Index \(index)")
                                            .background(index % 2 == 0 ? Color.purple : Color.orange)
                                    }
                                }
                            }
                        }
                    }
                }
            }
            .navigationTitle(Text("Sticky Grid"))
            .navigationBarTitledisplayMode(.inline)
        }
    }
    
    private func gridView() -> some View {
        Lazyvstack(spacing: 0,pinnedViews: [.sectionHeaders]) {
            Section(header: firstRowHeaderView()) {
                // Content here goes below the first sticky header/row
            }
        }
    }
    
    private func firstRowHeaderView() -> some View {
        let rowItems = [
            HeaderItem(title: "Price"),HeaderItem(title: "Change"),HeaderItem(title: "Ask"),HeaderItem(title: "Bid"),HeaderItem(title: "Quantity"),HeaderItem(title: "Last"),HeaderItem(title: "Close"),HeaderItem(title: "Today")
        ]
        
        return HStack(spacing: 0) {
            GridCell(title: "Symbol")
            TrackableScrollView([.horizontal],contentOffset: $scrollViewContentOffset) {                LazyHStack(spacing: 0) {
                    ForEach(rowItems,id: \.id) { item in
                        GridCell(title: item.title)
                    }
                }
            }
        }
        .background(Color.white)
    }
    
    private func firstColumnHeaderView() -> some View {
        let columnItems = [
            HeaderItem(title: "AAPL"),HeaderItem(title: "MS"),HeaderItem(title: "E"),HeaderItem(title: "TPPY"),HeaderItem(title: "MSFT"),HeaderItem(title: "A"),HeaderItem(title: "IBM"),HeaderItem(title: "TSLA")
        ]
        
        return Lazyvstack(alignment: .leading,spacing: 0) {
            ForEach(columnItems,id: \.id) { item in
                GridCell(title: item.title)
                    .background(Color.white)
            }
        }
    }
}

struct HeaderItem {
    let id = UUID()
    let title: String
}

struct GridCell: View {
    let title: String
    
    var body: some View {
        vstack(spacing: 0) {
            Spacer()
            Text("\(title)")
            Spacer()
            Divider()
                .background(Color.black)
        }
        .frame(width: 95,height: 44)
    }
}

Pinned first row

Pinned first column

Two scrolled horizontal scroll views

当视图垂直滚动时,顶行被固定,第一列也被固定。但是您可以看到标题的顶行(在符号之后)应该水平滚动,而事实并非如此。其下方的网格项也是如此,但它们是两个不同的滚动视图。它们是否可以通过某种绑定一起滚动?

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

相关推荐


Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其他元素将获得点击?
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。)
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbcDriver发生异常。为什么?
这是用Java进行XML解析的最佳库。
Java的PriorityQueue的内置迭代器不会以任何特定顺序遍历数据结构。为什么?
如何在Java中聆听按键时移动图像。
Java“Program to an interface”。这是什么意思?
Java在半透明框架/面板/组件上重新绘画。
Java“ Class.forName()”和“ Class.forName()。newInstance()”之间有什么区别?
在此环境中不提供编译器。也许是在JRE而不是JDK上运行?
Java用相同的方法在一个类中实现两个接口。哪种接口方法被覆盖?
Java 什么是Runtime.getRuntime()。totalMemory()和freeMemory()?
java.library.path中的java.lang.UnsatisfiedLinkError否*****。dll
JavaFX“位置是必需的。” 即使在同一包装中
Java 导入两个具有相同名称的类。怎么处理?
Java 是否应该在HttpServletResponse.getOutputStream()/。getWriter()上调用.close()?
Java RegEx元字符(。)和普通点?