UICollectionView進(jìn)階之路(一)

UICollectionView基礎(chǔ)

  • UICollectionViewFlowLayout:視圖布局對象钢坦,繼承自UICollectionViewLayout究孕。

所有的視圖布局對象都繼承自UICollectionViewLayout啥酱。若我們要自定義布局對象爹凹,我們一般繼承UICollectionViewFlowLayout就可以了。

  • 需要實現(xiàn)三個協(xié)議镶殷;UICollectionViewDataSource(數(shù)據(jù)源)禾酱、UICollectionViewDelegateFlowLayout(視圖布局)、UICollectionViewDelegate绘趋。

可以看得出颤陶,UICollectionView幾乎和UITableView一樣,但是視圖布局和裝飾視圖讓它更強大陷遮,UITableView能做到的UICollectionView都能做到滓走,UICollectionView能做到的UITableView不一定能做到(這也是我一直選擇UICollectionView的原因之一)。

UICollectionView實現(xiàn)步驟

  1. UICollectionView創(chuàng)建及注冊
  2. UICollectionViewDataSource的實現(xiàn)
  3. UICollectionViewDelegateFlowLayout的實現(xiàn)(或者自定義UICollectionViewLayout實現(xiàn))
  4. UICollectionViewDelegate的實現(xiàn)

熟悉UICollectionView的程序員都知道帽馋,實現(xiàn)過程很繁瑣搅方,數(shù)據(jù)源代理看的眼花繚亂,有思想的程序員也許都會在想同樣的問題:

  1. 每次都要注冊很煩绽族,是不是內(nèi)部可以根據(jù)某個標(biāo)識判斷是否注冊及自動注冊呢姨涡?
  2. 為什么內(nèi)部不能根據(jù)我的數(shù)據(jù)計算幾行幾列,創(chuàng)建初始化視圖及視圖的大小吧慢,更高級的自動緩存高度呢涛漂?
  3. UICollectionViewDelegateFlowLayout的實現(xiàn)太麻煩了,要是可以不要寫那么多該多好啊

我也一樣是個有思想的碼農(nóng)(哈哈)检诗,一直在尋求可以同時解決這些痛處的方法匈仗,一次在和同學(xué)的聊天中,和同學(xué)聊到了數(shù)據(jù)即視圖的思想逢慌,視圖的布局都是由數(shù)據(jù)來驅(qū)動的悠轩,于是就有了 UICollectionView進(jìn)階第一步,(以下都是個人想法涕癣,不喜勿噴哗蜈,有更好的想法可以聯(lián)系我)

SuperCollectionView

  • SuperCollectionView的結(jié)構(gòu)
SuperUICollectionView結(jié)構(gòu)圖.png
  1. SuperCollectionView的發(fā)動機(數(shù)據(jù)):(NSObject+XWReuseData)
@interface NSObject (XW)

/**
 cell或者h(yuǎn)eader,footer的高度,框架自動緩存
 */
@property (nonatomic, assign) CGFloat xw_height;

/**
 cell或者h(yuǎn)eader,footer的寬度坠韩,框架自動緩存
 */
@property (nonatomic, assign) CGFloat xw_width;

/**
 cell或者h(yuǎn)eader,footer的重用標(biāo)識距潘,框架自動緩存(可以為空,有默認(rèn)值)
 cell的重用標(biāo)識(默認(rèn)數(shù)據(jù)去除Data改為Cell)
 header或者footer的重用標(biāo)識 (默認(rèn)數(shù)據(jù)去除Data改為View)
 */
@property (nonatomic, strong) NSString *reuseIdentifier;

/**
 cell或者h(yuǎn)eader,footer是否重用
 */
@property (nonatomic, assign) BOOL unReusable;

#pragma mark -
#pragma mark - 以下屬性只對header或者footer生效
/**
 collectionView每個section的內(nèi)邊距
 */
@property(nonatomic , assign) UIEdgeInsets cell_secionInset;

/**
 collectionView每個section的邊距
 */
@property(nonatomic , assign) CGFloat cell_minimumLineSpacing;

/**
 collectionView每個item的邊距
 */
@property(nonatomic , assign) CGFloat cell_minimumInteritemSpacing;

@end

數(shù)據(jù)驅(qū)動視圖只搁,一個個簡單的數(shù)據(jù)可以拼湊出乎意料的頁面音比,只有你想不到,沒有SuperCollectionView做不到的

  1. SuperCollectionView注冊:(UICollectionView+XWRegister)
@interface UICollectionView (XWRegister)
/**
 * 注冊列表緩存
 */
@property (nonatomic, strong) NSMutableArray *reuseIdentifierList;

-(UICollectionViewCell *)dequeueReusableCellWithIdentify:(NSString *)identify indexPath:(NSIndexPath *)indexPath reusable:(BOOL )reusable;

-(UICollectionReusableView *)dequeueReusableView:(NSString *)identify indexPath:(NSIndexPath *)indexPath kind:(NSString *)kind reusable:(BOOL )reusable;

@end

在XWCollectionViewDataSourceDelegate內(nèi)完成了緩存重用標(biāo)識并判斷否注冊及自動注冊

  1. SuperCollectionView對外數(shù)據(jù)源接口協(xié)議
@protocol XWCollectionViewDataSource <NSObject>
@required
/**
 * cell數(shù)據(jù)源(支持多個section返回值為二重數(shù)組即可)
 */
- (NSMutableArray *)cellDataListWithCollectionView:(UICollectionView *)collectionView;
@optional
/**
 *  頭部數(shù)據(jù)源
 */
- (NSMutableArray *)headerDataListWithCollectionView:(UICollectionView *)collectionView;
/**
 *  尾部數(shù)據(jù)源
 */
- (NSMutableArray *)footerDataListWithCollectionView:(UICollectionView *)collectionView;
/**
 *  每個secion對應(yīng)的修飾背景view
 */
- (NSMutableArray<Class> *)decorationViewClassListWithCollectionView:(UICollectionView *)collectionView;

@end;

我對UICollectionView的數(shù)據(jù)源及UICollectionViewDelegateFlowLayout進(jìn)行了高度封裝(詳細(xì)的見XWCollectionViewDataSourceDelegate)氢惋,對代理進(jìn)行了一層轉(zhuǎn)發(fā)洞翩。

SuperCollectionView實戰(zhàn)

看了上面的是不是更加感興趣了(臥槽稽犁,還有這種操作),接下來就是見證奇跡的時刻骚亿,讓我們一起來看看現(xiàn)在是如何使用UICollectionView的吧


- (void)viewDidLoad {
    [super viewDidLoad];
    [self.view addSubview:self.cv];
    // Do any additional setup after loading the view, typically from a nib.
}
#pragma mark - XWCollectionViewDataSource

-(NSMutableArray *)headerDataListWithCollectionView:(UICollectionView *)collectionView{
    return self.headerDataList;
}

-(NSArray *)cellDataListWithCollectionView:(UICollectionView *)collectionView{
    return [[NSMutableArray alloc] initWithObjects:self.cellDataList,self.cellDataList,self.cellDataList, nil];
}

-(NSMutableArray *)footerDataListWithCollectionView:(UICollectionView *)collectionView{
    return self.footerDataList;
}

-(NSMutableArray<Class> *)decorationViewClassListWithCollectionView:(UICollectionView *)collectionView{
    return self.decroationViewClassList;    
}

#pragma mark - delegate
-(void)scrollViewDidScroll:(UIScrollView *)scrollView{
    
}

-(void)collectionView:(UICollectionView *)collectionView didSelectItemAtIndexPath:(NSIndexPath *)indexPath{

}

#pragma mark - getter
-(UICollectionView *)cv{
    if (!_cv) {
        _cv = [UICollectionView createWithFlowLayout];
        _cv.frame = CGRectMake(0, 0, self.view.bounds.size.width, [UIScreen mainScreen].bounds.size.height);
        _cv.backgroundColor = [UIColor whiteColor];
        _cv.xw_dataSource = self;
        _cv.xw_delegate = self;
    }
    return _cv;
}

-(NSMutableArray *)headerDataList{
    if (!_headerDataList) {
        _headerDataList = [NSMutableArray new];
        [_headerDataList addObject:[ACollectionViewHeaderData new]];
        [_headerDataList addObject:[ACollectionViewHeaderData new]];
        NSObject * defaultData = [NSObject new];
        defaultData.cell_width = 0.001;
        defaultData.cell_height = 0.001;
        defaultData.cell_minimumLineSpacing = 10;
        defaultData.cell_minimumInteritemSpacing = 10;
        defaultData.cell_secionInset = UIEdgeInsetsMake(10, 10, 10, 10);
        [_headerDataList addObject:defaultData];
    }
    return _headerDataList;
}
-(NSMutableArray *)cellDataList{
    if (!_cellDataList) {
        _cellDataList = [NSMutableArray new];
        ACollectionViewData * data = [ACollectionViewData new];
        data.color = [UIColor redColor];
        data.title = @"我是cell";
        [_cellDataList addObject:data];
        
        data = [ACollectionViewData new];
        data.color = [UIColor blueColor];
        data.title = @"我是cell";
        [_cellDataList addObject:data];
        
        data = [ACollectionViewData new];
        data.color = [UIColor grayColor];

        data.title = @"我是cell";
        [_cellDataList addObject:data];
        
        data = [ACollectionViewData new];
        data.color = [UIColor cyanColor];

        data.title = @"我是cell";
        [_cellDataList addObject:data];
        
        [_cellDataList addObject:data];
        data = [ACollectionViewData new];
        data.color = [UIColor blueColor];
        data.title = @"我是cell";
        [_cellDataList addObject:data];
    }
    return _cellDataList;
}

可以看出來data起到了很關(guān)鍵的作用已亥,幾個簡單的data就可以驅(qū)動一個UICollectionView,這就是數(shù)據(jù)即視圖来屠,這樣UICollectionView進(jìn)階之路走出了第一步虑椎,幾行代碼輕輕松松就可以搞定UICollectionView(我上我也行,哈哈)俱笛。如果你喜歡你也可以試試這樣處理哦~

但這遠(yuǎn)遠(yuǎn)還不夠捆姜,既然你能把數(shù)據(jù)源代理簡化成這樣,那你是不是能直接不寫數(shù)據(jù)源代理呢迎膜,想想連數(shù)據(jù)源都不用寫了泥技,那是種什么體驗啊,是的磕仅,沒錯珊豹,下一步要做的就是摒棄數(shù)據(jù)源(程序員:我不信,哈哈)宽涌,敬請期待UICollectionView進(jìn)階之路(二)平夜。

GitHub: https://github.com/WangJianShi/UICollectionView-Widget

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市卸亮,隨后出現(xiàn)的幾起案子忽妒,更是在濱河造成了極大的恐慌,老刑警劉巖兼贸,帶你破解...
    沈念sama閱讀 212,718評論 6 492
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件段直,死亡現(xiàn)場離奇詭異,居然都是意外死亡溶诞,警方通過查閱死者的電腦和手機鸯檬,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,683評論 3 385
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來螺垢,“玉大人喧务,你說我怎么就攤上這事⊥髌裕” “怎么了功茴?”我有些...
    開封第一講書人閱讀 158,207評論 0 348
  • 文/不壞的土叔 我叫張陵,是天一觀的道長孽亲。 經(jīng)常有香客問我坎穿,道長,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 56,755評論 1 284
  • 正文 為了忘掉前任玲昧,我火速辦了婚禮栖茉,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘孵延。我一直安慰自己吕漂,他們只是感情好,可當(dāng)我...
    茶點故事閱讀 65,862評論 6 386
  • 文/花漫 我一把揭開白布隙袁。 她就那樣靜靜地躺著痰娱,像睡著了一般弃榨。 火紅的嫁衣襯著肌膚如雪菩收。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 50,050評論 1 291
  • 那天鲸睛,我揣著相機與錄音娜饵,去河邊找鬼。 笑死官辈,一個胖子當(dāng)著我的面吹牛箱舞,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播拳亿,決...
    沈念sama閱讀 39,136評論 3 410
  • 文/蒼蘭香墨 我猛地睜開眼晴股,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了肺魁?” 一聲冷哼從身側(cè)響起电湘,我...
    開封第一講書人閱讀 37,882評論 0 268
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎鹅经,沒想到半個月后寂呛,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 44,330評論 1 303
  • 正文 獨居荒郊野嶺守林人離奇死亡瘾晃,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 36,651評論 2 327
  • 正文 我和宋清朗相戀三年贷痪,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片蹦误。...
    茶點故事閱讀 38,789評論 1 341
  • 序言:一個原本活蹦亂跳的男人離奇死亡劫拢,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出强胰,到底是詐尸還是另有隱情舱沧,我是刑警寧澤,帶...
    沈念sama閱讀 34,477評論 4 333
  • 正文 年R本政府宣布哪廓,位于F島的核電站狗唉,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏涡真。R本人自食惡果不足惜分俯,卻給世界環(huán)境...
    茶點故事閱讀 40,135評論 3 317
  • 文/蒙蒙 一肾筐、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧缸剪,春花似錦吗铐、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,864評論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至奋渔,卻和暖如春镊逝,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背嫉鲸。 一陣腳步聲響...
    開封第一講書人閱讀 32,099評論 1 267
  • 我被黑心中介騙來泰國打工撑蒜, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人玄渗。 一個月前我還...
    沈念sama閱讀 46,598評論 2 362
  • 正文 我出身青樓座菠,卻偏偏與公主長得像,于是被迫代替她去往敵國和親藤树。 傳聞我的和親對象是個殘疾皇子浴滴,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 43,697評論 2 351

推薦閱讀更多精彩內(nèi)容