支付宝五福实现 核心代码

//准备开始布局

- (void)prepareLayout {}

 

//返回的是决定cell样式的数组

 

- (NSArray<UICollectionViewLayoutAttributes *> *)layoutAttributesForElementsInRect:(CGRect)rect {    

    NSArray * attributes =  [super layoutAttributesForElementsInRect:rect];

    //计算中心点的contentOffset

    CGFloat centerX = self.collectionView.contentOffset.x + self.collectionView.bounds.size.width * 0.5;

    //获取每一个cell的布局属性

    for (UICollectionViewLayoutAttributes * attri in attributes) {

        //计算每一个cell中心与中心点的contentOffset距离

        CGFloat delat = ABS(attri.center.x - centerX);

       

        //计算比例

        CGFloat scales = 1 - delat / (self.collectionView.bounds.size.width);

        

        attri.transform = CGAffineTransformMakeScale(scales, scales);

    }   

    return attributes;

 

}

//实时刷新

 

- (BOOL)shouldInvalidateLayoutForBoundsChange:(CGRect)newBounds {

 

    return YES;

 

}

//targetContentOffset 调整后的contentOffset

//proposedContentOffset 滑动停止的contentOffset

 

- (CGPoint)targetContentOffsetForProposedContentOffset:(CGPoint)proposedContentOffset withScrollingVelocity:(CGPoint)velocity {

    

    // 计算最终的可见范围

    CGRect rect;

    rect.origin = proposedContentOffset;

    rect.size = self.collectionView.frame.size;

    

    // 取得cell的布局属性

    NSArray * attributes = [super layoutAttributesForElementsInRect:rect];

    

    CGFloat centerX = proposedContentOffset.x + self.collectionView.bounds.size.width * 0.5;

    

    //获取最小间距

    CGFloat minDetal = MAXFLOAT;

    

    for (UICollectionViewLayoutAttributes *attrs in attributes) {

        

        if (ABS(minDetal) > ABS(attrs.center.x - centerX)) {

            minDetal = attrs.center.x - centerX;

        }

    }

    // 在原有offset的基础上进行微调

    return CGPointMake(proposedContentOffset.x + minDetal, proposedContentOffset.y);

 

}

 

转载于:https://www.cnblogs.com/PSSSCode/p/5272046.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值