-
UICollectionView使用注意點(diǎn)
-
創(chuàng)建UICollectionView必須要有布局參數(shù)
-
cell必須通過(guò)注冊(cè)
-
cell必須自定義,系統(tǒng)cell沒(méi)有任何子控件
-
示例
#import "ViewController.h"
#import "PhotoCell.h"
@interface ViewController ()<UICollectionViewDataSource>
@end
static NSString * const ID = @"cell";
@implementation ViewController
- (void)viewDidLoad {
[super viewDidLoad];
//函數(shù)式編程思想(高聚合):把很多功能放在一個(gè)函數(shù)塊(block塊)去處理 多見(jiàn)于swift
UICollectionViewFlowLayout *layout = ({
UICollectionViewFlowLayout *layout = [[UICollectionViewFlowLayout alloc]init];
//設(shè)置水平滾動(dòng)
layout.scrollDirection = UICollectionViewScrollDirectionHorizontal;
//設(shè)置cell的尺寸
layout.itemSize = CGSizeMake(160, 160);
CGFloat margin = ([UIScreen mainScreen].bounds.size.width - 160) *0.5;
//設(shè)置內(nèi)邊距
layout.sectionInset = UIEdgeInsetsMake(0, margin, 0, margin);
//設(shè)置最小行間距
layout.minimumLineSpacing = 50;
layout;
});
UICollectionView *collectionView = ({
UICollectionView *collectionView = [[UICollectionView alloc]initWithFrame:CGRectZero collectionViewLayout:layout];
collectionView.backgroundColor = [UIColor blueColor];
collectionView.center = self.view.center;
collectionView.bounds =CGRectMake(0, 0, self.view.bounds.size.width, 200);
[self.view addSubview:collectionView];
collectionView;
});
//關(guān)閉水平滾動(dòng)條
collectionView.showsHorizontalScrollIndicator = NO;
collectionView.dataSource = self;
//注冊(cè)nib
[collectionView registerNib:[UINib nibWithNibName:NSStringFromClass([PhotoCell class]) bundle:nil] forCellWithReuseIdentifier:ID];
}
//有多少個(gè)cell
- (NSInteger)collectionView:(UICollectionView *)collectionView numberOfItemsInSection:(NSInteger)section
{
return 10;
}
//cell樣式
-(UICollectionViewCell *)collectionView:(UICollectionView *)collectionView cellForItemAtIndexPath:(NSIndexPath *)indexPath
{
PhotoCell *cell = [collectionView dequeueReusableCellWithReuseIdentifier:ID forIndexPath:indexPath];
NSString *imageName = [NSString stringWithFormat:@"%ld",indexPath.item + 1];
cell.image = [UIImage imageNamed:imageName];
return cell;
}
@end
-
UICollectionViewFlowLayout自定義布局
-
UICollectionViewFlowLayout自定義布局必須知道的5個(gè)方法
// 何時(shí)調(diào)用:collectionView第一次布局,collectionView刷新的時(shí)候也會(huì)調(diào)用
// 作用:計(jì)算cell的布局,條件:cell的位置是固定不變
- (void)prepareLayout
{
[super prepareLayout];
}
// 作用:指定一段區(qū)域給你這段區(qū)域內(nèi)cell的尺寸
// 可以一次性返回所有cell尺寸,也可以每隔一個(gè)距離返回cell
/**
UICollectionViewLayoutAttributes:確定cell的尺寸
一個(gè)UICollectionViewLayoutAttributes對(duì)象就對(duì)應(yīng)一個(gè)cell
拿到UICollectionViewLayoutAttributes相當(dāng)于拿到cell
*/
- (nullable NSArray<__kindof UICollectionViewLayoutAttributes *> *)layoutAttributesForElementsInRect:(CGRect)rect
{
NSArray *attrs = [super layoutAttributesForElementsInRect:CGRectMake(0, 0, MAXFLOAT, MAXFLOAT)];
return attrs;
}
// 何時(shí):用戶(hù)手指一松開(kāi)就會(huì)調(diào)用
// 作用:確定最終偏移量
- (CGPoint)targetContentOffsetForProposedContentOffset:(CGPoint)proposedContentOffset withScrollingVelocity:(CGPoint)velocity{
// 拖動(dòng)比較快 最終偏移量 不等于 手指離開(kāi)時(shí)偏移量
// 最終偏移量
CGPoint targetP = [super targetContentOffsetForProposedContentOffset:proposedContentOffset withScrollingVelocity:velocity];
// 獲取collectionView偏移量
NSLog(@"%@ %@",NSStringFromCGPoint(targetP),NSStringFromCGPoint(self.collectionView.contentOffset));
return CGPointZero;
}
// Invalidate:刷新
// 在滾動(dòng)的時(shí)候是否允許刷新布局
- (BOOL)shouldInvalidateLayoutForBoundsChange:(CGRect)newBounds{
return YES;
}
// 計(jì)算collectionView滾動(dòng)范圍
- (CGSize)collectionViewContentSize{
return [super collectionViewContentSize];
}
demo
最后編輯于 :
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者