UICollectionView 小总结 ---UICollectionViewFlowLayout

来源:互联网 发布:淘宝猫 编辑:程序博客网 时间:2024/06/04 18:37

1.只要显示的边界发生改变就重新布局

/** *  只要显示的边界发生改变就重新布局:    内部会重新调用prepareLayout和layoutAttributesForElementsInRect方法获得所有cell的布局属性 */- (BOOL)shouldInvalidateLayoutForBoundsChange:(CGRect)newBounds{    return YES;}

2.用来设置collectionView停止的滚动的那一刻的位置

/** *  用来设置collectionView停止滚动那一刻的位置 * *  @param proposedContentOffset 原本collectionView停止滚动那一刻的位置 *  @param velocity              滚动速度 */- (CGPoint)targetContentOffsetForProposedContentOffset:(CGPoint)proposedContentOffset withScrollingVelocity:(CGPoint)velocity{    // 1.计算出scrollView最后会停留的范围    CGRect lastRect;    lastRect.origin = proposedContentOffset;    lastRect.size = self.collectionView.frame.size;        // 计算屏幕最中间的x    CGFloat centerX = proposedContentOffset.x + self.collectionView.frame.size.width * 0.5;        // 2.取出这个范围内的所有属性    NSArray *array = [self layoutAttributesForElementsInRect:lastRect];        // 3.遍历所有属性    CGFloat adjustOffsetX = MAXFLOAT;    for (UICollectionViewLayoutAttributes *attrs in array) {        if (ABS(attrs.center.x - centerX) < ABS(adjustOffsetX)) {            adjustOffsetX = attrs.center.x - centerX;        }    }        return CGPointMake(proposedContentOffset.x + adjustOffsetX, proposedContentOffset.y);}

3.初始化工作的实现位置

/** *  一些初始化工作最好在这里实现 */- (void)prepareLayout{    [super prepareLayout];         // 每个cell的尺寸    self.itemSize = CGSizeMake(HMItemWH, HMItemWH);    CGFloat inset = (self.collectionView.frame.size.width - HMItemWH) * 0.5;    self.sectionInset = UIEdgeInsetsMake(0, inset, 0, inset);    // 设置水平滚动    self.scrollDirection = UICollectionViewScrollDirectionHorizontal;    self.minimumLineSpacing = HMItemWH * 0.7;        // 每一个cell(item)都有自己的UICollectionViewLayoutAttributes    // 每一个indexPath都有自己的UICollectionViewLayoutAttributes}


4.重新布局--返回rect范围内的布局属性

- (NSArray *)layoutAttributesForElementsInRect:(CGRect)rect{    // 0.计算可见的矩形框    CGRect visiableRect;    visiableRect.size = self.collectionView.frame.size;    visiableRect.origin = self.collectionView.contentOffset;        // 1.取得默认的cell的UICollectionViewLayoutAttributes    NSArray *array = [super layoutAttributesForElementsInRect:rect];    // 计算屏幕最中间的x    CGFloat centerX = self.collectionView.contentOffset.x + self.collectionView.frame.size.width * 0.5;        // 2.遍历所有的布局属性    for (UICollectionViewLayoutAttributes *attrs in array) {        // 如果不在屏幕上,直接跳过        if (!CGRectIntersectsRect(visiableRect, attrs.frame)) continue;                // 每一个item的中点x        CGFloat itemCenterX = attrs.center.x;                // 差距越小, 缩放比例越大        // 根据跟屏幕最中间的距离计算缩放比例        CGFloat scale = 1 + HMScaleFactor * (1 - (ABS(itemCenterX - centerX) / HMActiveDistance));        attrs.transform = CGAffineTransformMakeScale(scale, scale);    }        return array;}

5.自定义布局--返回indexPath这个位置Item的布局属性

- (UICollectionViewLayoutAttributes *)layoutAttributesForItemAtIndexPath:(NSIndexPath *)indexPath{    UICollectionViewLayoutAttributes *attrs = [UICollectionViewLayoutAttributes layoutAttributesForCellWithIndexPath:indexPath];        attrs.size = CGSizeMake(50, 50);        // 圆的半径    CGFloat circleRadius = 70;    CGPoint circleCenter = CGPointMake(self.collectionView.frame.size.width * 0.5, self.collectionView.frame.size.height * 0.5);    // 每个item之间的角度    CGFloat angleDelta = M_PI * 2 / [self.collectionView numberOfItemsInSection:indexPath.section];        // 计算当前item的角度    CGFloat angle = indexPath.item * angleDelta;        attrs.center = CGPointMake(circleCenter.x + circleRadius * cosf(angle), circleCenter.y - circleRadius * sinf(angle));        attrs.zIndex = indexPath.item;        return attrs;}

6.返回所有尺寸

/** *  返回所有的尺寸 */- (CGSize)collectionViewContentSize{    __block NSString *maxColumn = @"0";    [self.maxYDict enumerateKeysAndObjectsUsingBlock:^(NSString *column, NSNumber *maxY, BOOL *stop) {        if ([maxY floatValue] > [self.maxYDict[maxColumn] floatValue]) {            maxColumn = column;        }    }];    return CGSizeMake(0, [self.maxYDict[maxColumn] floatValue] + self.sectionInset.bottom);}


别人写的别人写的

0 0
原创粉丝点击