重寫(xiě)prepareLayout方法
- 作用:在這個(gè)方法中做一些初始化操作
- 注意:一定要調(diào)用[super prepareLayout]
重寫(xiě)layoutAttributesForElementsInRect:方法
- 作用:
- 這個(gè)方法的返回值是個(gè)數(shù)組
- 這個(gè)數(shù)組中存放的都是UICollectionViewLayoutAttributes對(duì)象
- UICollectionViewLayoutAttributes對(duì)象決定了cell的排布方式(frame等)
重寫(xiě)shouldInvalidateLayoutForBoundsChange:方法
- 作用:如果返回YES疾渣,那么collectionView顯示的范圍發(fā)生改變時(shí)房资,就會(huì)重新刷新布局
- 一旦重新刷新布局井佑,就會(huì)按順序調(diào)用下面的方法:
- prepareLayout
- layoutAttributesForElementsInRect:
重寫(xiě)targetContentOffsetForProposedContentOffset:withScrollingVelocity:方法
- 作用:返回值決定了collectionView停止?jié)L動(dòng)時(shí)最終的偏移量(contentOffset)
- 參數(shù):
- proposedContentOffset:原本情況下,collectionView停止?jié)L動(dòng)時(shí)最終的偏移量
- velocity:滾動(dòng)速率扛邑,通過(guò)這個(gè)參數(shù)可以了解滾動(dòng)的方向
示例展示
自定義布局.gif
/**
* 準(zhǔn)備布局
*/
- (void)prepareLayout {
[super prepareLayout];
self.itemSize = CGSizeMake(200, 200);
self.scrollDirection = UICollectionViewScrollDirectionHorizontal;
//設(shè)置起始的內(nèi)邊距
CGFloat inset = (self.collectionView.frame.size.width - self.itemSize.width) * 0.5;
self.sectionInset = UIEdgeInsetsMake(0, inset, 0, inset);
}
/**
* 用來(lái)刷新重新布局
*/
- (BOOL)shouldInvalidateLayoutForBoundsChange:(CGRect)newBounds {
return YES;
}
/**
* 用來(lái)布局cell的frame
*/
- (NSArray<UICollectionViewLayoutAttributes *> *)layoutAttributesForElementsInRect:(CGRect)rect {
NSArray *attrsArray = [super layoutAttributesForElementsInRect:rect];
//獲取到collectionView的中心點(diǎn)的X
CGFloat centerX = self.collectionView.contentOffset.x + self.collectionView.frame.size.width * 0.5;
for (UICollectionViewLayoutAttributes *attr in attrsArray) {
CGFloat delta = ABS(attr.center.x - centerX);
CGFloat scale = 1 - delta / self.collectionView.frame.size.width;
attr.transform = CGAffineTransformMakeScale(scale, scale);
}
return attrsArray;
}
/**
* 用來(lái)布局cell最終的落點(diǎn)
*/
- (CGPoint)targetContentOffsetForProposedContentOffset:(CGPoint)proposedContentOffset withScrollingVelocity:(CGPoint)velocity {
CGRect rect = CGRectMake(proposedContentOffset.x, 0, self.collectionView.frame.size.width, self.collectionView.frame.size.height);
//獲取到cell的frame
NSArray *attrsArray = [super layoutAttributesForElementsInRect:rect];
CGFloat centerX = proposedContentOffset.x + self.collectionView.frame.size.width * 0.5;
//計(jì)算cellectionView中心點(diǎn)最小的值
CGFloat minDetla = CGFLOAT_MAX;
for (UICollectionViewLayoutAttributes *attr in attrsArray) {
if (ABS(minDetla) > ABS(centerX - attr.center.x)) {
minDetla = attr.center.x - centerX;
}
}
proposedContentOffset.x += minDetla;
return proposedContentOffset;
}