如何使用 UIViewControllerRepresentable 在 SwiftUI 中呈现 UICollectionView [英] How to present a UICollectionView in SwiftUI with UIViewControllerRepresentable

查看:84
本文介绍了如何使用 UIViewControllerRepresentable 在 SwiftUI 中呈现 UICollectionView的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

首先,我知道可以使用 SwiftUI 列表等选项来获得类似的效果.但是我需要 UICollectionView 的自动滚动功能,所以我真的很想实现一个老派"版本.我什至不想要理想的组合布局版本.

Firstly, I know there are options for using SwiftUI Lists etc... to get similar effects. But I need the automatic scrolling capabilities of a UICollectionView so I'd really like to just implement an "old school" version. I don't even want the compositional layout version ideally.

我当前的代码如下所示:

My current code looks like this:

import SwiftUI

struct CollectionView: UIViewControllerRepresentable {

private var isActive: Binding<Bool>
private let viewController = UIViewController()
private let collectionController: UICollectionView

init(_ isActive: Binding<Bool>) {
    self.isActive = isActive
    self.collectionController = UICollectionView(frame: CGRect(x: 0, y: 0, width: 100, height: 200), collectionViewLayout: UICollectionViewFlowLayout())
}
func makeUIViewController(context: UIViewControllerRepresentableContext<CollectionView>) -> UIViewController {
    return viewController
}

func updateUIViewController(_ uiViewController: UIViewController, context: UIViewControllerRepresentableContext<CollectionView>) {
    if self.isActive.wrappedValue && collectionController.delegate == nil { // to not show twice
        collectionController.delegate = context.coordinator
        collectionController.dataSource = context.coordinator
    }
}

func makeCoordinator() -> Coordintor {
    return Coordintor(owner: self)
}

final class Coordintor: NSObject, UICollectionViewDelegate, UICollectionViewDataSource {
    weak var viewController:UIViewController?
    func collectionView(_ collectionView: UICollectionView, numberOfItemsInSection section: Int) -> Int {
        return 3
    }
    var cellId = "Cell"
    func collectionView(_ collectionView: UICollectionView, cellForItemAt indexPath: IndexPath) -> UICollectionViewCell {
        let cell = collectionView.dequeueReusableCell(withReuseIdentifier: cellId, for: indexPath)
        return cell
    }
    // works as delegate
    let owner: CollectionView
    init(owner: CollectionView) {
        self.owner = owner

    }
}
}

不幸的是,我得到的只是预览中的空白屏幕.现在,如果我可以只显示大量的红色方块选择,我可以滚动浏览并在出现时自动滚动到底部,那将是理想的.

Unfortunately, all I get is a blank screen in the preview. For now if I can just display a big selection of red squares which I can scroll through and auto scroll to the bottom onAppear, that would be ideal.

谢谢!

推荐答案

这是最小的可运行演示.(注意:如果全部以编程方式完成,则必须注册单元格)

Here is minimal runnable demo. (Note: Cell have to be registered if all is done programmatically)

class MyCell: UICollectionViewCell {
}

struct CollectionView: UIViewRepresentable {
    func makeUIView(context: Context) -> UICollectionView {
        let view = UICollectionView(frame: .zero, collectionViewLayout: UICollectionViewFlowLayout())
        view.backgroundColor = UIColor.clear
        view.dataSource = context.coordinator

        view.register(MyCell.self, forCellWithReuseIdentifier: "myCell")
        return view
    }

    func updateUIView(_ uiView: UICollectionView, context: Context) {
    }

    func makeCoordinator() -> Coordinator {
        Coordinator()
    }

    class Coordinator: NSObject, UICollectionViewDataSource {
        func collectionView(_ collectionView: UICollectionView, numberOfItemsInSection section: Int) -> Int {
            3
        }

        func collectionView(_ collectionView: UICollectionView, cellForItemAt indexPath: IndexPath) -> UICollectionViewCell {
            let cell = collectionView.dequeueReusableCell(withReuseIdentifier: "myCell", for: indexPath) as! MyCell
            cell.backgroundColor = UIColor.red
            return cell
        }
    }
}

struct TestUICollectionView_Previews: PreviewProvider {
    static var previews: some View {
        CollectionView()
    }
}

这篇关于如何使用 UIViewControllerRepresentable 在 SwiftUI 中呈现 UICollectionView的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆