首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

UIViewRepresentable中的UICollectionView不会从onAppear scrollToItem

UIViewRepresentable是SwiftUI中的一个协议,用于将UIKit中的视图包装成SwiftUI视图。UICollectionView是UIKit中的一个类,用于展示可滚动的、多列的、可定制的集合视图。

在UIViewRepresentable中使用UICollectionView时,可以通过设置UICollectionView的contentOffset来实现滚动到指定的item。在onAppear生命周期方法中,可以调用UICollectionView的scrollToItem方法来实现滚动到指定的item。

以下是一个示例代码,演示了如何在UIViewRepresentable中使用UICollectionView并在onAppear中滚动到指定的item:

代码语言:txt
复制
import SwiftUI

struct MyCollectionView: UIViewRepresentable {
    let data: [String]
    let scrollToIndex: Int
    
    func makeUIView(context: Context) -> UICollectionView {
        let layout = UICollectionViewFlowLayout()
        layout.scrollDirection = .vertical
        let collectionView = UICollectionView(frame: .zero, collectionViewLayout: layout)
        collectionView.dataSource = context.coordinator
        collectionView.delegate = context.coordinator
        collectionView.register(UICollectionViewCell.self, forCellWithReuseIdentifier: "Cell")
        return collectionView
    }
    
    func updateUIView(_ uiView: UICollectionView, context: Context) {
        uiView.reloadData()
        if scrollToIndex < data.count {
            let indexPath = IndexPath(item: scrollToIndex, section: 0)
            uiView.scrollToItem(at: indexPath, at: .centeredVertically, animated: true)
        }
    }
    
    func makeCoordinator() -> Coordinator {
        Coordinator(self)
    }
    
    class Coordinator: NSObject, UICollectionViewDataSource, UICollectionViewDelegateFlowLayout {
        let parent: MyCollectionView
        
        init(_ parent: MyCollectionView) {
            self.parent = parent
        }
        
        func collectionView(_ collectionView: UICollectionView, numberOfItemsInSection section: Int) -> Int {
            parent.data.count
        }
        
        func collectionView(_ collectionView: UICollectionView, cellForItemAt indexPath: IndexPath) -> UICollectionViewCell {
            let cell = collectionView.dequeueReusableCell(withReuseIdentifier: "Cell", for: indexPath)
            cell.backgroundColor = .blue
            return cell
        }
        
        func collectionView(_ collectionView: UICollectionView, layout collectionViewLayout: UICollectionViewLayout, sizeForItemAt indexPath: IndexPath) -> CGSize {
            CGSize(width: 100, height: 100)
        }
    }
}

struct ContentView: View {
    let data = ["Item 1", "Item 2", "Item 3", "Item 4", "Item 5"]
    
    var body: some View {
        MyCollectionView(data: data, scrollToIndex: 2)
            .onAppear {
                // 在这里可以执行滚动到指定item的操作
            }
    }
}

struct ContentView_Previews: PreviewProvider {
    static var previews: some View {
        ContentView()
    }
}

在上述示例代码中,MyCollectionView是一个遵循UIViewRepresentable协议的自定义视图。它包含一个data数组用于展示UICollectionView的内容,以及一个scrollToIndex参数用于指定要滚动到的item的索引。

在updateUIView方法中,我们调用了UICollectionView的reloadData方法来刷新数据,并通过scrollToItem方法将UICollectionView滚动到指定的item。在onAppear闭包中,我们可以执行滚动到指定item的操作。

请注意,这只是一个示例代码,实际使用时需要根据具体需求进行适当的修改和调整。

腾讯云相关产品和产品介绍链接地址:

以上是一些腾讯云的产品,供参考使用。

页面内容是否对你有帮助?
有帮助
没帮助

相关·内容

没有搜到相关的视频

领券