拆分Collection为多个Component,类似IGList,可以将一个页面的业务拆分为多个模块,是一种模块化业务层的实现。
一个页面复杂,内容多而且有明确的业务上的分割,并且有大量内容可以实现复用,如果使用原生CollectionView会产生大量if-else,并且会使Controller非常庞大。初衷是为了拆分Controller,后来在使用过程中用来拆分模块化业务,在目前的使用过程中还是非常的符合我们的业务。
比如淘宝、考拉等以内容为主的平台,模块间相对独立,同时又有很多模块(推荐、相关、评论等)可以完全复用,就非常符合DDComponent的使用场景。和Instagram的IGList
比较类似,两者分析会在这篇文章中说明。
可以通过该组件来创建模块比较多比较复杂的UICollectionView 或者tableView布局 本组件的实现代码采用的是 djs66256/DDComponent作者的DDComponent 源地址链接
原作者苍耳 关于组件对用的文章 【美学的表现层组件化之路】
pod 'DDComponent', :git => 'https://github.com/liuxc123/DDComponent.git', :tag => '1.0.11'
设计之初考虑到减少学习成本,大部分接口都直接继承于系统接口,如果熟悉UICollectionView
和UITableView
编程的马上就能学会。
@interface YourComponent : DDCollectionViewSectionComponent
@end
@implementation
- (instancetype)init
{
self = [super init];
if (self) {
self.size = CGSizeMake(DDComponentAutomaticDimension, 44);
// config here.
// Remember self.collectionView is nil until it is added to root component.
}
return self;
}
- (void)prepareCollectionView {
[super prepareCollectionView];
// register your cell here.
}
- (NSInteger)numberOfSectionsInCollectionView:(UICollectionView *)collectionView {
return 1;
}
- (NSInteger)collectionView:(UICollectionView *)collectionView numberOfItemsInSection:(NSInteger)section {
return 1;
}
- (CGSize)collectionView:(UICollectionView *)collectionView layout:(UICollectionViewLayout *)collectionViewLayout sizeForItemAtIndexPath:(NSIndexPath *)indexPath {
return ... // Return your cell
}
@end
其他事件均和系统delegate方法一致。
- (void)collectionView:(UICollectionView *)collectionView didSelectItemAtIndexPath:(NSIndexPath *)indexPath {
// select item
}
- (void)collectionView:(UICollectionView *)collectionView willDisplayCell:(UICollectionViewCell *)cell forItemAtIndexPath:(NSIndexPath *)indexPath {
// will display
}
- 视图组件: 只负责视图展示,比如一个包含小列表的模块,或者仅仅只有一个元素的模块。只负责职责内的视图展示。
- 容器组件: 只负责组件间的组合,比如按照顺序或者空态等组合模式,当然最顶层的一个组件也是一个容器类组件。
- 基础组件, 0个section 多个item 需要用容器包裹
- cell内容内部实现
- 需使用容器ItemGroupComponent嵌套
- 基础组件, 一个Section 多个items
- cell、header、footer内容内部实现
- headerVIew继承此组件
- footerVIew继承此组件
- 基础组件, 一个Section 多个items
- Header以headerComponent为主
- Footer以footerComponent为主
- cell内容内部实现
- 容器组件, 一个Section 多个items
- Header以headerComponent为主
- Footer以footerComponent为主
- 子视图以subComponents为主
- 容器组件, 多个Section
- 子视图subComponents嵌套ItemComponent、SectionComponent、HeaderFooterSectionComponent等容器组件
- 根容器组件,绑定collectionView或tableView
- 多个Section
- 子视图subComponents嵌套SectionComponent等容器组件
- 状态机容器组件
- 用与切换Loading、Empty、Normal视图
- 表单组件,一个View的容器组件
- cell不重用
这是一个组装的例子。
实际使用时我们所需要实现的,是视图组件部分,也就是上图红色部分。
如果需要扩展FlowLayout或者CollectionView的功能,增加delegate的方法,仅需要让容器组件
将该回调传给子组件即可。
优先使用属性来配置size
, inset
等属性,这样能够更灵活的使用。
由于直接采用系统方法,所以indexPath
代表的是collectionView的位置,并没有一一对应component数据源的index
,所以使用过程中需要自己来判断数据源的index
是否就是indexPath.item
。