UICollectionView使用筆記

本筆記主要記錄了這幾個(gè)方面

1.基礎(chǔ)布局
2.刷新數(shù)據(jù)或UI的一些細(xì)節(jié)操作
3.自定義UICollectionViewFlowLayout達(dá)到自定義布局

  • 基礎(chǔ)布局
    UICollectionViewFlowLayout的默認(rèn)最小行間距、列間距為10.0晴氨;可以通過flowLayout直接訪問其屬性修改,也可以通過實(shí)現(xiàn)對(duì)應(yīng)代理方法進(jìn)行修改缕探。

??最初幾次用的時(shí)候應(yīng)該都踩過這個(gè)坑吧娘扩,明明算的好好的itemSize,就是空大了,或者就是少顯示一列??

- (CGFloat)collectionView:(UICollectionView *)collectionView layout:(UICollectionViewLayout *)collectionViewLayout minimumLineSpacingForSectionAtIndex:(NSInteger)section{
    return 行間距;
}

- (CGFloat)collectionView:(UICollectionView *)collectionView layout:(UICollectionViewLayout*)collectionViewLayout minimumInteritemSpacingForSectionAtIndex:(NSInteger)section{
    return 列間距;
}

UICollectionViewFlowLayout *layout = [[UICollectionViewFlowLayout alloc]init];
layout.minimumLineSpacing = 0;
layout.minimumInteritemSpacing = 0;
layout.itemSize = CGSizeMake(80, 80);
//滾動(dòng)方向
layout.scrollDirection = UICollectionViewScrollDirectionVertical;
  • 刷新
    [self.collectionV performBatchUpdates:^{

    } completion:^(BOOL finished) {

    }];

類似tableview的beginUpdate和endUpdate,會(huì)給進(jìn)行的批量更新添加一個(gè)過程历涝。

當(dāng)然,也有相反的情況漾唉,我只想默默地修改某處UI荧库、不做任何過渡或動(dòng)效不需要用戶關(guān)注的時(shí)候,可以這么干

[UICollectionView performWithoutAnimation:^{
        [self.collectionV reloadSections:[NSIndexSet indexSetWithIndex:0]];
    }];

重點(diǎn)毡证、要考的??
有些情況下直接[collectionView reloadData]是不能更新UI的,需要重新加載過item之后才會(huì)更新蔫仙。
1料睛、
場(chǎng)景一,刪除單個(gè)item

/*
  collection執(zhí)行deleteItems后只會(huì)調(diào)用numberOfItemsInSection刷新一下item的數(shù)量摇邦,并不會(huì)調(diào)用cellForItemAtIndexPath來刷新數(shù)據(jù)
下次點(diǎn)擊某item取的indexPath將是刪除操作之前的indexPath
 */
[self.collectionV performBatchUpdates:^{      
     [ws.imagesArr removeObjectAtIndex:indexPath.row];
     [ws.collectionV deleteItemsAtIndexPaths:@[indexPath]];
}completion:^(BOOL finished){
     [ws.collectionV reloadData];
}];

2恤煞、
場(chǎng)景二,在第n個(gè)row對(duì)應(yīng)的item做了操作施籍,需要更新其他item某一小部分UI居扒,此時(shí)只有數(shù)據(jù)源數(shù)組下標(biāo)n的數(shù)據(jù)產(chǎn)生了變化。

這時(shí)候會(huì)發(fā)現(xiàn)直接reloadData是不能即時(shí)更新UI的丑慎,需要下次加載item的時(shí)候喜喂,重新走過cellForItemAtIndexPath代理方法才會(huì)更新,但這樣產(chǎn)品是不能買單的??竿裂。
那么玉吁,可以reloadSections;雖然即時(shí)更新了腻异,但是呼閃那一下似乎不太滿意进副,UI/UE那邊應(yīng)該過不去、悔常、影斑、此時(shí)可以在performWithoutAnimation這個(gè)block內(nèi)執(zhí)行reloadSection達(dá)到取消閃爍的目的。該類方法功能就不用說了机打、矫户、、

[UICollectionView performWithoutAnimation:^{
        [self.collectionV reloadSections:[NSIndexSet indexSetWithIndex:0]];
 }];
  • 自定義FlowLayout
  1. 創(chuàng)建一個(gè)名為YTCollectionViewFlowLayout的繼承于UICollectionViewFlowLayout的類残邀。
  2. 重寫 *- (NSArray<UICollectionViewLayoutAttributes *> )layoutAttributesForElementsInRect:(CGRect)rect 方法
  3. layoutAttributesForElementsInRect方法內(nèi)自行設(shè)置顯示規(guī)則

比如在一屏幕見方的控件里九宮格形式展示圖片:

/**
 @艨濉U涎摹!顯示動(dòng)態(tài)照片用膳汪,collection.size就是contentSize,也就是全在視野內(nèi)
 Nǖ!遗嗽!除了以下張數(shù)照片時(shí)粘我,其他時(shí)候的itemSize都是 contentSize.width/3 見方,不需要處理
 1曰弧U髯帧!動(dòng)態(tài)模型內(nèi)會(huì)計(jì)算好此collectionView應(yīng)有的contentSize
 */
- (NSArray<UICollectionViewLayoutAttributes *> *)layoutAttributesForElementsInRect:(CGRect)rect{
    
    NSArray <UICollectionViewLayoutAttributes *>*arr = [super layoutAttributesForElementsInRect:rect];
    
    if (arr.count == 6) {
        arr[0].frame = CGRectMake(0, 0, _itemWidth * 2 + _margin, _itemWidth * 2 + _margin);
        arr[1].frame = CGRectMake(CGRectGetMaxX(arr[0].frame) + _margin, 0, _itemWidth, _itemWidth );
        arr[2].frame = CGRectMake(CGRectGetMaxX(arr[0].frame) + _margin, CGRectGetMaxY(arr[1].frame) + _margin, _itemWidth, _itemWidth);
        arr[3].frame = CGRectMake(0,CGRectGetMaxY(arr[0].frame) + _margin, _itemWidth, _itemWidth);
        arr[4].frame = CGRectMake(_itemWidth + _margin, CGRectGetMaxY(arr[0].frame) + _margin, _itemWidth, _itemWidth);
        arr[5].frame = CGRectMake((_itemWidth + _margin) * 2, CGRectGetMaxY(arr[0].frame) + _margin, _itemWidth, _itemWidth);
    }else if (arr.count == 5) {
        arr[0].frame = CGRectMake(0, 0, _SCREENWidth_2,_SCREENWidth_2);
        arr[1].frame = CGRectMake(_SCREENWidth_2 + _margin, 0, _SCREENWidth_2, _SCREENWidth_2);
        arr[2].frame = CGRectMake(0, CGRectGetMaxY(arr[1].frame) + _margin, _itemWidth, _itemWidth);
        arr[3].frame = CGRectMake(_margin + _itemWidth,CGRectGetMaxY(arr[0].frame) + _margin, _itemWidth, _itemWidth);
        arr[4].frame = CGRectMake((_itemWidth + _margin) * 2, CGRectGetMaxY(arr[0].frame) + _margin, _itemWidth, _itemWidth);
    }else if (arr.count == 4) {
        arr[0].frame = CGRectMake(0, 0, _SCREENWidth_2,_SCREENWidth_2);
        arr[1].frame = CGRectMake(_SCREENWidth_2 + _margin, 0, _SCREENWidth_2, _SCREENWidth_2);
        arr[2].frame = CGRectMake(0, CGRectGetMaxY(arr[1].frame) + _margin, _SCREENWidth_2, _SCREENWidth_2);
        arr[3].frame = CGRectMake(_SCREENWidth_2 + _margin, CGRectGetMaxY(arr[0].frame) + _margin, _SCREENWidth_2, _SCREENWidth_2);
    }else if (arr.count == 2) {
        arr[0].frame = CGRectMake(0, 0, _SCREENWidth_2,_SCREENWidth_2);
        arr[1].frame = CGRectMake(_SCREENWidth_2 + _margin, 0, _SCREENWidth_2, _SCREENWidth_2);
    }else if (arr.count == 1) {
        arr[0].frame = CGRectMake(0, 0, SCREEN_Width,SCREEN_Width);
    }
    
    return arr;
}

水平有限娇豫,只是記錄了下自己應(yīng)用場(chǎng)景??

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末匙姜,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子冯痢,更是在濱河造成了極大的恐慌氮昧,老刑警劉巖,帶你破解...
    沈念sama閱讀 211,376評(píng)論 6 491
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件浦楣,死亡現(xiàn)場(chǎng)離奇詭異袖肥,居然都是意外死亡,警方通過查閱死者的電腦和手機(jī)振劳,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,126評(píng)論 2 385
  • 文/潘曉璐 我一進(jìn)店門椎组,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人历恐,你說我怎么就攤上這事寸癌。” “怎么了弱贼?”我有些...
    開封第一講書人閱讀 156,966評(píng)論 0 347
  • 文/不壞的土叔 我叫張陵灵份,是天一觀的道長(zhǎng)。 經(jīng)常有香客問我哮洽,道長(zhǎng)填渠,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 56,432評(píng)論 1 283
  • 正文 為了忘掉前任鸟辅,我火速辦了婚禮氛什,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘匪凉。我一直安慰自己枪眉,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 65,519評(píng)論 6 385
  • 文/花漫 我一把揭開白布再层。 她就那樣靜靜地躺著贸铜,像睡著了一般堡纬。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上蒿秦,一...
    開封第一講書人閱讀 49,792評(píng)論 1 290
  • 那天烤镐,我揣著相機(jī)與錄音,去河邊找鬼棍鳖。 笑死炮叶,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的渡处。 我是一名探鬼主播镜悉,決...
    沈念sama閱讀 38,933評(píng)論 3 406
  • 文/蒼蘭香墨 我猛地睜開眼,長(zhǎng)吁一口氣:“原來是場(chǎng)噩夢(mèng)啊……” “哼医瘫!你這毒婦竟也來了侣肄?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 37,701評(píng)論 0 266
  • 序言:老撾萬榮一對(duì)情侶失蹤醇份,失蹤者是張志新(化名)和其女友劉穎稼锅,沒想到半個(gè)月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體被芳,經(jīng)...
    沈念sama閱讀 44,143評(píng)論 1 303
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡缰贝,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 36,488評(píng)論 2 327
  • 正文 我和宋清朗相戀三年馍悟,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了畔濒。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 38,626評(píng)論 1 340
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡锣咒,死狀恐怖侵状,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情毅整,我是刑警寧澤趣兄,帶...
    沈念sama閱讀 34,292評(píng)論 4 329
  • 正文 年R本政府宣布,位于F島的核電站悼嫉,受9級(jí)特大地震影響艇潭,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜戏蔑,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,896評(píng)論 3 313
  • 文/蒙蒙 一蹋凝、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧总棵,春花似錦鳍寂、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,742評(píng)論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽捍壤。三九已至,卻和暖如春鞍爱,著一層夾襖步出監(jiān)牢的瞬間鹃觉,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 31,977評(píng)論 1 265
  • 我被黑心中介騙來泰國(guó)打工硬霍, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留帜慢,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 46,324評(píng)論 2 360
  • 正文 我出身青樓唯卖,卻偏偏與公主長(zhǎng)得像粱玲,于是被迫代替她去往敵國(guó)和親。 傳聞我的和親對(duì)象是個(gè)殘疾皇子拜轨,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 43,494評(píng)論 2 348

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