CollectionKit
使用声明性方式管理复杂 UICollectionView
的框架,代码行数非常少。深受 https://github.com/maxsokolov/TableKit 和 https://github.com/Instagram/IGListKit 启发。
警告
开发仍在进行中。一些更改可能会影响向后兼容性
特点
- 声明性
UICollectionView
管理 - 不需要实现
UICollectionViewDataSource
和UICollectionViewDelegate
- 简单地将模型映射到单元格
- 自动差异化
- 支持从代码和 xibs 以及 Storyboard 中创建单元格和可重用视图
- 灵活
- 自动注册单元格和可重用视图
- 修复 iOS11 中的滚动指示器截断问题(《http://www.openradar.me/34308893》)
入门指南
CollectionKit
的关键概念包括 Section
、Item
和 Director
。其中,Item
负责配置 UICollectionViewCell
的样式、大小和行为;Section
负责管理一系列项目,并为每个项目提供信息(如头部、尾部以及各种填充和边距:部分填充、项目之间最小间距和行间距)。Director
负责提供 UICollectionView
的所有信息和数据更新。
基本用法
设置 UICollectionView 和 director
设置 collection view
collectionView = UICollectionView(frame: view.bounds, colletionViewLayout: UICollectionViewFlowLayout())
collectionDirector = CollectionDirector(colletionView: collectionView)
创建 items
let item1 = CollectionItem<CollectionCell>(item: "hello!")
let item2 = CollectionItem<CollectionCell>(item: "im")
let item3 = CollectionItem<CollectionCell>(item: "ColletionKit")
let item4 = CollectionItem<ImageCell>(item: "greeting.png")
创建 section 并将 items 放入 section
let section = CollectionSection()
let items = [item1, item2, item3, item4]
section += items
director += section
将 section 放入 director 并重新加载 director
director += section
director.reload()
Cell 配置
Cell 必须实现 ConfigurableCollectionCell
协议。您需要指定 cell 大小和配置方法
extension CollectionCell : ConfigurableCollectionItem {
static func estimatedSize(item: String?, boundingSize: CGSize) -> CGSize {
return CGSize(width: collectionViewSize.width, height: 50)
}
func configure(item: String) {
textLabel.text = item
}
}
动作
使用函数式语法实现类似 didSelectItem
或 shouldHighlightItem
的动作
let row = CollectionItem<CollectionCell>(item: "text")
.onSelect({ (_) in
print("i was tapped!")
}).onDisplay({ (_) in
print("i was displayed")
})
可用的动作
选择时
取消选择时
显示时
结束显示时
高亮时
取消高亮时
Section 配置
您可以使用 section 对象来设置项目间间距、行间距和部分填充
let section = CollectionSection()
section.minimumInterItemSpacing = 2
section.insetForSection = UIEdgeInsetsMake(0, 20, 0, 20)
section.lineSpacing = 2
更新
您可以通过操作 section 和 item 对象来更新 collection view,而不需要任何 IndexPath
:将常规操作放入 performUpdates
块中
self.director.performUpdates { [unowned self] in
self.section.append(item: row)
self.section.insert(item: row, at: 0)
self.section.remove(item: item)
}
自定义分区
您可以使用AbstractCollectionSection
协议提供自己的分区实现。例如,您可以使用它来与CollectionDirector
配合使用Realm.Results
,以保存Results
的延迟行为或实现可展开的分区。