本筆記主要記錄了這幾個(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
- 創(chuàng)建一個(gè)名為YTCollectionViewFlowLayout的繼承于UICollectionViewFlowLayout的類残邀。
- 重寫 *- (NSArray<UICollectionViewLayoutAttributes *> )layoutAttributesForElementsInRect:(CGRect)rect 方法
- 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)景??