0

假设您想使用自定义初始化程序来实例化UICollectionViewController.

使用UICollectionViewFlowLayout,这很简单:

init() {
    let layout = UICollectionViewFlowLayout()
    super.init(collectionViewLayout: layout)
}

但是,UICollectionViewCompositionalLayout的指定初始化器需要一些参数,最重要的是 section 参数:

UICollectionViewCompositionalLayout(section:, configuration:)
// or 
UICollectionViewCompositionalLayout(sectionProvider:, configuration:)

这意味着我必须在UICollectionViewController. 如果布局包含诸如枚举之类的部分标识符,那么它也必须在初始化程序中。如果你必须NSCollectionLayoutEnvironment在你的布局中包含,它也会成为问题。

init() {
    let item = /..
    let group = /..
    let section = /..
    let layout = UICollectionViewCompositionalLayout(section: section)
    super.init(collectionViewLayout: layout)
}

我正在查看 Apple 的示例,所有示例都使用UIViewController而不是UICollectionViewController默认使用。尽管这些示例没有使用任何自定义初始化程序,但此方法确实通过允许我们在之后创建布局来解决上述问题:

var collectionView: UICollectionView! = nil
collectionView = UICollectionView(frame: view.bounds, collectionViewLayout: createLayout())

您现在可以简单地使用UIViewController的自定义初始化程序。

UICollectionViewCompositionalLayout使用自定义初始化程序的最佳方法是什么?

4

1 回答 1

1

这个你可能想多了。绝对没有法律阻止您更改分配给集合视图的布局;它的collectionViewLayout财产可以随时转让。

因此,只需在初始化程序中为集合视图控制器分配一个“虚拟”布局,然后viewDidLoad像往常一样进行布局的真正创建和分配。

举一个常见的用例:如果你想使用组合布局,你将如何在故事板中创建一个集合视图控制器?我所做的是给故事板中的集合视图一个流布局。然后viewDidLoad我在代码中创建真正的布局(组合布局)并将其分配给self.collectionView.collectionViewLayout,并没有造成任何伤害。

于 2020-12-27T22:58:47.540 回答