ios開發(fā)中比較常用到的就是 tableView 和 collectionView,二者分別用于列表展示和 網(wǎng)格展示;由于tableView的易用性幾乎每個(gè)APP都會(huì)用到; 相對tableView萝快,collectionView使用起來比較繁瑣,所以collectionView的使用不常見笔咽。但UICollectionView也有自身的特點(diǎn)鳍徽,比如橫向布局、多行或者多列(瀑布流)展示首昔。
一寡喝、創(chuàng)建collectionView(collectionView控制器)
(collectionView)
- (instancetype)initWithFrame:(CGRect)frame collectionViewLayout:(UICollectionViewLayout *)layout
(collectionView控制器)
- (instancetype)initWithCollectionViewLayout:(UICollectionViewLayout *)layout ;
初始化類似tableView,設(shè)置delegate 和 datasource勒奇;
不同于tablView初始化設(shè)置UITableViewStyle拘荡,而collctionView初始化設(shè)置UICollectionViewLayout(一般用它的子類UICollectionViewFlowLayout)。
此處的UICollectionViewLayout是用于存儲(chǔ)collectionView的一些布局屬性:
@property (nonatomic) CGFloat minimumLineSpacing;
@property (nonatomic) CGFloat minimumInteritemSpacing;
@property (nonatomic) CGSize itemSize;
@property (nonatomic) UICollectionViewScrollDirection scrollDirection;
@property (nonatomic) UIEdgeInsets sectionInset;
cell間距的設(shè)置需要用到以上這些關(guān)鍵性屬性撬陵。
二珊皿、布局協(xié)議
UICollectionViewDelegateFlowLayout
協(xié)議中有以下這幾個(gè)和布局相關(guān)的方法
- (CGSize)collectionView:(UICollectionView *)collectionView layout:(UICollectionViewLayout*)collectionViewLayout sizeForItemAtIndexPath:(NSIndexPath *)indexPath;
- (UIEdgeInsets)collectionView:(UICollectionView *)collectionView layout:(UICollectionViewLayout*)collectionViewLayout insetForSectionAtIndex:(NSInteger)section;
- (CGFloat)collectionView:(UICollectionView *)collectionView layout:(UICollectionViewLayout*)collectionViewLayout minimumLineSpacingForSectionAtIndex:(NSInteger)section;
- (CGFloat)collectionView:(UICollectionView *)collectionView layout:(UICollectionViewLayout*)collectionViewLayout minimumInteritemSpacingForSectionAtIndex:(NSInteger)section;
- (CGSize)collectionView:(UICollectionView *)collectionView layout:(UICollectionViewLayout*)collectionViewLayout referenceSizeForHeaderInSection:(NSInteger)section;
- (CGSize)collectionView:(UICollectionView *)collectionView layout:(UICollectionViewLayout*)collectionViewLayout referenceSizeForFooterInSection:(NSInteger)section;
這幾個(gè)方法的功能和UICollectionViewLayout的4個(gè)屬性基本相對應(yīng):
1.屬性用于統(tǒng)一設(shè)置
2.對象方法既可以統(tǒng)一設(shè)置,也可以區(qū)別設(shè)置
這幾個(gè)方法名的區(qū)別在后半部分
xxxxx sizeForItemAtIndexPath:(NSIndexPath *)indexPath
等同于屬性 itemSize巨税;
xxxxx insetForSectionAtIndex:(NSInteger)section
等同于屬性 sectionInset蟋定;
xxxxx minimumLineSpacingForSectionAtIndex:(NSInteger)section
等同于屬性 minimumLineSpacing;
xxxxx minimumInteritemSpacingForSectionAtIndex:(NSInteger)section
等同于屬性 minimumInteritemSpacing草添;
三驶兜、圖文解析對應(yīng)屬性(針對不同滾動(dòng)方向)
gif中每個(gè)不同顏色代表不同的section
水平方向滾動(dòng)的collectionView,豎直方向的間距是固定的:minimumInteritemSpacing指的是同一個(gè)section 內(nèi)部item的豎直方向間隙;
minimumLineSpacing指的是同一個(gè)section 內(nèi)部 item的水平方向間隙抄淑;
豎直方向滾動(dòng)的collectionView屠凶,水平方向的間距是固定的:minimumInteritemSpacing指的是同一個(gè)section 內(nèi)部item的水平方向間隙;
minimumLineSpacing指的是同一個(gè)section 內(nèi)部 item的豎直方向間隙肆资;
總結(jié):
minimumInteritemSpacing表示 同一個(gè)section內(nèi)部間item的 和滾動(dòng)方向垂直方向的間距矗愧;
minimumLineSpacing指的是同一個(gè)section 內(nèi)部 item 的滾動(dòng)方向的間距;
sectionInset指的是每個(gè)section內(nèi)縮進(jìn)郑原;屬性設(shè)置的每個(gè)section的內(nèi)錯(cuò)進(jìn)是相同的唉韭,都是正數(shù)。如果需要實(shí)現(xiàn)不同的setion的不同的內(nèi)縮進(jìn)犯犁,可以使用對象方法
- (UIEdgeInsets)collectionView:(UICollectionView *)collectionView layout:(UICollectionViewLayout*)collectionViewLayout insetForSectionAtIndex:(NSInteger)section;
來實(shí)現(xiàn)属愤。
注意:
在寫demo的過程中,發(fā)現(xiàn)collectionView的contentInsetAdjustmentBehavior(等同于控制器的automaticallyAdjustsScrollViewInsets屬性)默認(rèn)為UIScrollViewContentInsetAdjustmentAutomatic枚舉值酸役,會(huì)自適應(yīng)控制器的邊距住诸,避開導(dǎo)航欄和狀態(tài)欄,而使得collectionView的真實(shí)高度 和設(shè)置的高度不一致(相差狀態(tài)欄和導(dǎo)航欄的高度和)涣澡。
demo地址:https://github.com/NightSkyWatchers/collectionView只壳,歡迎下載觀摩指正,內(nèi)有彩蛋