IVCollectionKit 1.0.0

IVCollectionKit 1.0.0

Igor Vedeneev 维护。



  • 作者
  • ivedeneev

CollectionKit

使用声明性方式管理复杂 UICollectionView 的框架,代码行数非常少。深受 https://github.com/maxsokolov/TableKithttps://github.com/Instagram/IGListKit 启发。

警告

开发仍在进行中。一些更改可能会影响向后兼容性

特点

  • 声明性 UICollectionView 管理
  • 不需要实现 UICollectionViewDataSourceUICollectionViewDelegate
  • 简单地将模型映射到单元格
  • 自动差异化
  • 支持从代码和 xibs 以及 Storyboard 中创建单元格和可重用视图
  • 灵活
  • 自动注册单元格和可重用视图
  • 修复 iOS11 中的滚动指示器截断问题(《http://www.openradar.me/34308893》)

入门指南

CollectionKit 的关键概念包括 SectionItemDirector。其中,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
    }
}

动作

使用函数式语法实现类似 didSelectItemshouldHighlightItem 的动作

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的延迟行为或实现可展开的分区。