重寫(xiě)UICollectionView的FlowLayout布局
- (instancetype)init{
if (self = [super init]) {
self.itemSize = CGSizeMake(kScreenWidth / 2, kScreenHeight / 2 - 49 - 30);
self.minimumLineSpacing = 2;
self.minimumInteritemSpacing = 2;
self.sectionInset = UIEdgeInsetsMake(2, 2, 2, 2);
}
return self;
}
/**
* collectionView的顯示范圍發(fā)生改變的時(shí)候,調(diào)用下面這個(gè)方法是否重新刷新
*
* @param newBounds
*
* @return 是否重新刷新
*/
- (BOOL)shouldInvalidateLayoutForBoundsChange:(CGRect)newBounds
{
return YES;
}
/**
* 布局的初始化操作
*/
- (void)prepareLayout
{
[super prepareLayout];
// 設(shè)置為水平滾動(dòng)
self.scrollDirection = UICollectionViewScrollDirectionHorizontal;
// 設(shè)置內(nèi)邊距
CGFloat insetGap = (self.collectionView.frame.size.width - self.itemSize.width) * 0.5;
self.sectionInset = UIEdgeInsetsMake(0, insetGap, 0, insetGap);
}
/**
* 設(shè)置cell的顯示大小
*
* @param rect 范圍
*
* @return 返回所有元素的布局
*/
- (NSArray *)layoutAttributesForElementsInRect:(CGRect)rect
{
// 獲取計(jì)算好的布局屬性
NSArray *arr = [[NSArray alloc]initWithArray:[super layoutAttributesForElementsInRect:rect] copyItems:YES];
for (int i = 0; i < arr.count; i ++) {
UICollectionViewLayoutAttributes *att = arr[i];
//算比例
//拿到每個(gè)item的位置 算出itemCenterX 和collectionCenterX 的一個(gè)距離
CGFloat distance = ABS(att.center.x - self.collectionView.frame.size.width * 0.5 - self.collectionView.contentOffset.x);
CGFloat scale = 0.5;
CGFloat w = (self.collectionView.frame.size.width + self.itemSize.width) * 0.5;
if (distance >= w) {
scale = 0.5;
}else{
scale = scale + (1- distance / w ) * 0.5;
}
att.transform = CGAffineTransformMakeScale(scale, scale);
}
return arr;
}
//滑動(dòng)完成后,會(huì)來(lái)到此方法 - 線性滑動(dòng)
//proposedContentOffset 最后停止的 contentOffset
- (CGPoint)targetContentOffsetForProposedContentOffset:(CGPoint)proposedContentOffset withScrollingVelocity:(CGPoint)velocity
{
//proposedContentOffset 滑動(dòng)之后最后停的位置
CGRect rect;
rect.origin = proposedContentOffset;
rect.size = self.collectionView.frame.size;
//獲取停止時(shí),顯示的cell的frame
//NSArray *tempArray = [super layoutAttributesForElementsInRect:rect];
NSArray *tempArray = [[NSArray alloc]initWithArray:[super layoutAttributesForElementsInRect:rect] copyItems:YES];
CGFloat gap = 1000;
CGFloat a = 0;
for (int i = 0; i < tempArray.count; i++) {
//判斷和中心的距離,得到最小的那個(gè)
if (gap > ABS([tempArray[i] center].x - proposedContentOffset.x - self.collectionView.frame.size.width * 0.5)) {
gap = ABS([tempArray[i] center].x - proposedContentOffset.x - self.collectionView.frame.size.width * 0.5);
a = [tempArray[i] center].x - proposedContentOffset.x - self.collectionView.frame.size.width * 0.5;
}
}
CGPoint point =CGPointMake(proposedContentOffset.x + a , proposedContentOffset.y);
return point;
}
動(dòng)畫(huà)效果.gif