- IGListKit是一个CollectionView的附加使用组件库,没有依赖CollectionView,是一个独立的组件
- 它将collectionView的Model、Cell、Viewcontroller很好的隔开,并添加了自己独有的SectionController来管理Cell,同时用adapter管理Model、View、ViewController
- 上代码 ->
1. 创建adapter(关联self, 本ViewController)
lazy var adapter: ListAdapter = {
let adapter = ListAdapter.init(updater: ListAdapterUpdater(), viewController: self)
return adapter
}()
2. 创建collection
let collectionView: UICollectionView = {
let layout = UICollectionViewFlowLayout()
layout.scrollDirection = .vertical
// layout.estimatedItemSize = .init(width: 1, height: 1)
let view = UICollectionView.init(frame: .zero, collectionViewLayout: layout)
return view
}()
3. 创建测试model
var data: [GXDPostModel]?
let json: [String: Any] = [
"username": "bob",
"image": "https://www.baidu.com/link?url=1Iq8rbcwEAwy4PvEEci0W2LsfdAxLuNuwjx0b4EkTj8qj5lMcnkPfeJVXsgMG5-miJwr_e4e7Dn93GIS8LQxvjCBnuzTNv5L1Kkr8S-FomVW4EXvpF8gK7qmdg3SYPNFsSgB9eeP2cB7C_eIuEaelOseO6GxyNk6ZWlS4ZBX2jYXkvMuh96sDkeOMq-Sd8yt2eay8HYyWpI3nmCAf0vIYx7Z5l0lIydpGycPtQgq4RvXa6r-0XR77pgxnHFjybyIpBgQFTNwUVqv6By8CUjdaYqh-l84JjOaQUBl7BIxASiZRaCQOP3PiRII7jLDZWFM9zMeX1CT70Hg4VYH6cbYR9ivxuA3TQ1u4tWenTTAUK9BouKN9KkC8jBmAjj4CIDb41rY7zU7NJ8rxHUEWA3ykGVViyT8iDBx0fxBEGXf9kK8s7gXjA-sRzwsF9FWcsmg2D4PKvbR_Lrzre5bEQgfkK1xxYmBL15njfefb4gB9smSrFO2svvEgdBYOGgD9F7N3NA3OlZyO3DaqAkWLIuprt94iyqlOu6mz7kG7RObXrsW0lKFaAQ0ZSVmgVBWzT7sidRWdREk9sOeDK9UPpu0PeNMMQug6TwQ3MwfBdDNRU9-R-T0RER2jtOiAzNc4z4fBPbxT7oBWg0c5jE7t0j6KzyNj-YYVZUWjXqPOhS-BhC&wd=&eqid=deebd7420008aa6b0000000661b0826a",
"comment": [
"content": "my name is bob, this is a bigboy"
]
]
4. adapter关联collectionView和添加在self上的代理来关联
sectionController和model,以及collectionView的空页面
adapter.collectionView = collectionView
adapter.dataSource = self
func objects(for listAdapter: ListAdapter) -> [ListDiffable] {
return data ?? [ListDiffable]()
}
func listAdapter(_ listAdapter: ListAdapter, sectionControllerFor object: Any) -> ListSectionController {
GXDPostSectionC()
}
func emptyView(for listAdapter: ListAdapter) -> UIView? {
nil
}
5. 封装一下model、sectionController、bindSectionController来解决每次需要依赖IGListKit的问题
class GXDIGListModel: NSObject, ListDiffable, Convertible {
required override init() {
super.init()
}
/// 唯一标识符
func diffIdentifier() -> NSObjectProtocol {
self
}
/// reload时,需要更新(通过比较新model与上一个model之间的区别去更新,比如是同一个的比较方法)
func isEqual(toDiffableObject object: ListDiffable?) -> Bool {
isEqual(object)
}
}
class GXDCollectionCell: UICollectionViewCell, ListBindable {
func bindViewModel(_ viewModel: Any) {
}
}
class GXDSectionController<T>: ListSectionController {
var model: T?
override func sizeForItem(at index: Int) -> CGSize {
.init(width: 1, height: 1)
}
override func didUpdate(to object: Any) {
model = object as? T
}
}
class GXDBindSectionController: ListBindingSectionController<ListDiffable>, ListBindingSectionControllerDataSource {
override init() {
super.init()
self.dataSource = self
}
func sectionController(_ sectionController: ListBindingSectionController<ListDiffable>, viewModelsFor object: Any) -> [ListDiffable] {
[ListDiffable]()
}
func sectionController(_ sectionController: ListBindingSectionController<ListDiffable>, cellForViewModel viewModel: Any, at index: Int) -> UICollectionViewCell & ListBindable {
GXDCollectionCell()
}
func sectionController(_ sectionController: ListBindingSectionController<ListDiffable>, sizeForViewModel viewModel: Any, at index: Int) -> CGSize {
.zero
}
}
/// sectionController之间的间距通过inset控制
override init() {
super.init()
inset = .init(top: <#T##CGFloat#>, left: <#T##CGFloat#>, bottom: <#T##CGFloat#>, right: <#T##CGFloat#>)
}
/// 封装adapter和collectionView
class GXDAdapterViewController: GXDViewController, ListAdapterDataSource {
let collectionView: UICollectionView = {
let layout = UICollectionViewFlowLayout()
layout.scrollDirection = .vertical
layout.estimatedItemSize = UICollectionViewFlowLayout.automaticSize
let view = UICollectionView.init(frame: .zero, collectionViewLayout: layout)
view.backgroundColor = .white
return view
}()
lazy var adapter: ListAdapter = {
let adapter = ListAdapter.init(updater: ListAdapterUpdater(), viewController: self)
adapter.dataSource = self
return adapter
}()
override func viewDidLoad() {
super.viewDidLoad()
view.addSubview(collectionView)
adapter.collectionView = collectionView
collectionView.snp.makeConstraints { make in
make.top.equalTo(kNavigationbarHeight)
make.left.right.bottom.equalToSuperview()
}
}
func objects(for listAdapter: ListAdapter) -> [ListDiffable] {
[ListDiffable]()
}
func listAdapter(_ listAdapter: ListAdapter, sectionControllerFor object: Any) -> ListSectionController {
ListSectionController()
}
func emptyView(for listAdapter: ListAdapter) -> UIView? {
nil
}
}
ps: 参考链接:
https://learnku.com/articles/24068
https://jovins.cn/posts/IGListKit/
网友评论