iOS開發(fā)-瀑布流

前言:

忙里偷閑今膊,忽然想起以前自己實現(xiàn)的一個瀑布流功能些阅,就拿出來完善了下;說起這個瀑布流斑唬,還是在以前自己還是iOS開發(fā)小白的時候市埋,學(xué)習(xí)來的,后來我自己動手模仿蘋果API里自帶的布局類寫法恕刘,重新實現(xiàn)了下缤谎,方便大家可以更熟悉的使用,話不多說褐着,進(jìn)入正題坷澡。

一、準(zhǔn)備

1含蓉、首先準(zhǔn)備好plist文件频敛,以及需要用到的工具類,工具類可以自己下載導(dǎo)入馅扣,也可以cocoapods導(dǎo)入


1533266010749.jpg

1533266033205.jpg

1533266147661.jpg

1533266173431.jpg

2斟赚、接著創(chuàng)建我們的布局類WaterFallFlowLayout,繼承于UICollectionViewLayout岂嗓,既然是模仿汁展,那我們就要設(shè)定好對應(yīng)的屬性和代理方法,如下圖:


1533266493595.jpg

以及我們的數(shù)組和初始化


1533266583321.jpg

二厌殉、實現(xiàn)

實現(xiàn)自定義布局食绿,我們需要實現(xiàn)布局類里的四個方法,如下:
1公罕、- (void)prepareLayout {......}
具體實現(xiàn)代碼如下

//初始化加載器紧,每次刷新也都會加載
- (void)prepareLayout {
    [super prepareLayout];
    //刷新時清空item屬性數(shù)組
    [self.attributes removeAllObjects];
    //刷新時清空列高數(shù)組
    [self.itemHeights removeAllObjects];
    //添加每列的默認(rèn)起始高度
    for (int i = 0; i < kScreenWidth/self.itemWidth; i++) {
        [self.itemHeights addObject:@(self.minimumLineSpacing + self.headerReferenceSize.height + self.sectionInset.top)];
    }
    //獲取collectionView的所有區(qū)數(shù)量
    NSUInteger sectionCount = [self.collectionView numberOfSections];
    //獲取collectionView的所有單元格數(shù)量
    for (int i = 0; i < sectionCount; i++) {
        //獲取每個區(qū)的單元格數(shù)量
        NSUInteger itemCount = [self.collectionView numberOfItemsInSection:i];
        for (int j = 0; j < itemCount; j++) {
            //得到每個單元格布局屬性
            UICollectionViewLayoutAttributes *attribute = [self layoutAttributesForItemAtIndexPath:[NSIndexPath indexPathForItem:j inSection:i]];
            //添加進(jìn)布局屬性數(shù)組中
            [self.attributes addObject:attribute];
        }
    }
    
}

2、- (UICollectionViewLayoutAttributes *)layoutAttributesForItemAtIndexPath:(NSIndexPath *)indexPath {......}
具體實現(xiàn)代碼如下:

//返回每個單元格的布局屬性
- (UICollectionViewLayoutAttributes *)layoutAttributesForItemAtIndexPath:(NSIndexPath *)indexPath {
    //創(chuàng)建每個單元格的布局屬性
    UICollectionViewLayoutAttributes *attribute = [UICollectionViewLayoutAttributes layoutAttributesForCellWithIndexPath:indexPath];
    //計算高h(yuǎn)eight
    CGFloat height = 0;
    if (self.delegate) {
        height = [self.delegate waterFallFlowLayout:self heightForItemAtIndexPath:indexPath width:self.itemWidth];
    }
    //計算坐標(biāo)x和y,需要找到最小的列高值和列號楼眷,所以需要一個數(shù)組來存放所有的列高
    //聲明一個列號代表我們需要尋找的最小的列高值,默認(rèn)為0
    NSUInteger minColumn = 0;
    //聲明一個最小的列高值铲汪,獲取第0列的列高值熊尉,默認(rèn)為最小的
    CGFloat minItemHeight = [self.itemHeights[0] floatValue];
    //for循環(huán)尋找最小的列高值和列號
    for (int i = 1; i < kScreenWidth/self.itemWidth; i++) {
        CGFloat itemHeight = [self.itemHeights[i] floatValue];
        if (itemHeight < minItemHeight) {
            minItemHeight = itemHeight;
            minColumn = i;
        }
    }
    //for循環(huán)結(jié)束,最小的列號和列高值就確定了掌腰,此時先計算坐標(biāo)x
    CGFloat x = self.sectionInset.left + minColumn * self.minimumInteritemSpacing + minColumn * self.itemWidth;
    //此時坐標(biāo)y也就確定了
    CGFloat y;
    //獲得列數(shù)
    NSUInteger columnCount = kScreenWidth/self.itemWidth;
    if (indexPath.item/columnCount == 0) {
        if (indexPath.section == 0) {
            y = self.headerReferenceSize.height + minItemHeight;
        } else {
            y = minItemHeight;
        }
    } else {
        y = self.minimumLineSpacing + minItemHeight;
    }
    //設(shè)置每個單元格的大小
    attribute.frame = CGRectMake(x, y, self.itemWidth, height);
    //更新列高數(shù)組中的的高度
    self.itemHeights[minColumn] = @(CGRectGetMaxY(attribute.frame));
    return attribute;
}

3狰住、第三個方法比較簡單,直接貼代碼

//返回布局屬性數(shù)組
- (NSArray<UICollectionViewLayoutAttributes *> *)layoutAttributesForElementsInRect:(CGRect)rect {
    return self.attributes;
}

4齿梁、- (CGSize)collectionViewContentSize {......}
具體實現(xiàn)代碼如下:

//返回集合視圖內(nèi)容大小
- (CGSize)collectionViewContentSize {
    CGFloat maxItemHeight = [self.itemHeights[0] floatValue];
    for (int i = 1; i < kScreenWidth/self.itemWidth; i++) {
        CGFloat height = [self.itemHeights[i] floatValue];
        if (maxItemHeight < height) {
            maxItemHeight = height;
        }
    }
    CGFloat collectionViewHeight = maxItemHeight + self.headerReferenceSize.height + self.footerReferenceSize.height + self.sectionInset.bottom;
    return CGSizeMake(kScreenWidth, collectionViewHeight);
}

三催植、運行

主界面添加上集合視圖,實現(xiàn)功能勺择,具體使用很簡單创南,就不多說,直接上運行結(jié)果省核,如下圖:


1533267511446.jpg

大功告成稿辙!

四、最后

附上demo:WaterFallFlowLayout

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末气忠,一起剝皮案震驚了整個濱河市邻储,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌笔刹,老刑警劉巖芥备,帶你破解...
    沈念sama閱讀 221,635評論 6 515
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異舌菜,居然都是意外死亡萌壳,警方通過查閱死者的電腦和手機,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 94,543評論 3 399
  • 文/潘曉璐 我一進(jìn)店門日月,熙熙樓的掌柜王于貴愁眉苦臉地迎上來袱瓮,“玉大人,你說我怎么就攤上這事爱咬〕呓瑁” “怎么了?”我有些...
    開封第一講書人閱讀 168,083評論 0 360
  • 文/不壞的土叔 我叫張陵精拟,是天一觀的道長燎斩。 經(jīng)常有香客問我,道長蜂绎,這世上最難降的妖魔是什么栅表? 我笑而不...
    開封第一講書人閱讀 59,640評論 1 296
  • 正文 為了忘掉前任,我火速辦了婚禮师枣,結(jié)果婚禮上怪瓶,老公的妹妹穿的比我還像新娘。我一直安慰自己践美,他們只是感情好洗贰,可當(dāng)我...
    茶點故事閱讀 68,640評論 6 397
  • 文/花漫 我一把揭開白布找岖。 她就那樣靜靜地躺著,像睡著了一般敛滋。 火紅的嫁衣襯著肌膚如雪许布。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 52,262評論 1 308
  • 那天绎晃,我揣著相機與錄音爹脾,去河邊找鬼。 笑死箕昭,一個胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的解阅。 我是一名探鬼主播落竹,決...
    沈念sama閱讀 40,833評論 3 421
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼货抄!你這毒婦竟也來了述召?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 39,736評論 0 276
  • 序言:老撾萬榮一對情侶失蹤蟹地,失蹤者是張志新(化名)和其女友劉穎积暖,沒想到半個月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體怪与,經(jīng)...
    沈念sama閱讀 46,280評論 1 319
  • 正文 獨居荒郊野嶺守林人離奇死亡夺刑,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 38,369評論 3 340
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了分别。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片遍愿。...
    茶點故事閱讀 40,503評論 1 352
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖耘斩,靈堂內(nèi)的尸體忽然破棺而出沼填,到底是詐尸還是另有隱情,我是刑警寧澤括授,帶...
    沈念sama閱讀 36,185評論 5 350
  • 正文 年R本政府宣布坞笙,位于F島的核電站,受9級特大地震影響荚虚,放射性物質(zhì)發(fā)生泄漏薛夜。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點故事閱讀 41,870評論 3 333
  • 文/蒙蒙 一曲管、第九天 我趴在偏房一處隱蔽的房頂上張望却邓。 院中可真熱鬧,春花似錦院水、人聲如沸腊徙。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,340評論 0 24
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽撬腾。三九已至螟蝙,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間民傻,已是汗流浹背胰默。 一陣腳步聲響...
    開封第一講書人閱讀 33,460評論 1 272
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留漓踢,地道東北人牵署。 一個月前我還...
    沈念sama閱讀 48,909評論 3 376
  • 正文 我出身青樓,卻偏偏與公主長得像喧半,于是被迫代替她去往敵國和親奴迅。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 45,512評論 2 359