如何将 UICollectionViewController 的自定义初始化程序与 UICollectionViewCompositionalLayout 一起使用?
How to use a UICollectionViewController's custom initializer with UICollectionViewCompositionalLayout?
假设您想使用自定义初始化程序来实例化 UICollectionViewController
。
有了UICollectionViewFlowLayout
,就简单了:
init() {
let layout = UICollectionViewFlowLayout()
super.init(collectionViewLayout: layout)
}
但是,UICollectionViewCompositionalLayout
的指定初始化器需要一些参数,最重要的是节参数:
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 的 examples,它们都默认使用 UIViewController
而不是 UICollectionViewController
。即使示例不使用任何自定义初始化程序,此方法也通过允许我们在之后创建布局来解决上述问题:
var collectionView: UICollectionView! = nil
collectionView = UICollectionView(frame: view.bounds, collectionViewLayout: createLayout())
您现在可以简单地使用 UIViewController
的自定义初始化器。
将 UICollectionViewCompositionalLayout
与自定义初始化程序一起使用的最佳方法是什么?
你可能想多了。绝对没有法律阻止您更改 分配给集合视图的布局;它的 collectionViewLayout
属性 可以随时分配。
所以只需在初始化程序中为集合视图控制器分配一个“虚拟”布局,然后像往常一样在 viewDidLoad
中真正创建和分配布局。
举一个常见的用例:如果您想使用组合布局,您将如何在故事板中创建集合视图控制器?我所做的是为情节提要中的集合视图提供流式布局。然后在 viewDidLoad
中,我在代码中创建了真正的布局(组合布局)并将其分配给 self.collectionView.collectionViewLayout
,没有造成任何伤害。
假设您想使用自定义初始化程序来实例化 UICollectionViewController
。
有了UICollectionViewFlowLayout
,就简单了:
init() {
let layout = UICollectionViewFlowLayout()
super.init(collectionViewLayout: layout)
}
但是,UICollectionViewCompositionalLayout
的指定初始化器需要一些参数,最重要的是节参数:
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 的 examples,它们都默认使用 UIViewController
而不是 UICollectionViewController
。即使示例不使用任何自定义初始化程序,此方法也通过允许我们在之后创建布局来解决上述问题:
var collectionView: UICollectionView! = nil
collectionView = UICollectionView(frame: view.bounds, collectionViewLayout: createLayout())
您现在可以简单地使用 UIViewController
的自定义初始化器。
将 UICollectionViewCompositionalLayout
与自定义初始化程序一起使用的最佳方法是什么?
你可能想多了。绝对没有法律阻止您更改 分配给集合视图的布局;它的 collectionViewLayout
属性 可以随时分配。
所以只需在初始化程序中为集合视图控制器分配一个“虚拟”布局,然后像往常一样在 viewDidLoad
中真正创建和分配布局。
举一个常见的用例:如果您想使用组合布局,您将如何在故事板中创建集合视图控制器?我所做的是为情节提要中的集合视图提供流式布局。然后在 viewDidLoad
中,我在代码中创建了真正的布局(组合布局)并将其分配给 self.collectionView.collectionViewLayout
,没有造成任何伤害。