美文网首页项目以及封装iOS DeveloperiOS 开发
iOS 弹簧效果(CollectionView实现)

iOS 弹簧效果(CollectionView实现)

作者: 爆裂少女小鸭子 | 来源:发表于2016-11-22 16:00 被阅读310次

    这个是我根据@allsome 大神的印象笔记弹簧效果那篇改成oc的,因为大神之前是swift写的 我看到底下的评论说有的用oc写的稍微有点问题,所以我就想根据大神的方法 用oc写出来 可以大家一起分享

    spring.gif

    我们先了解三个概念
    **contentSize: **The size of the content view. 其实就是scrollview可以滚动的区域,比如frame = (0 ,0 ,320 ,480) contentSize = (320 ,960),代表你的scrollview可以上下滚动,滚动区域为frame大小的两倍。
    contentOffset:The point at which the origin of the content view is offset from the origin of the scroll view. 是scrollview当前显示区域顶点相对于frame顶点的偏移量,比如上个例子你拉到最下面,contentoffset就是(0 ,480),也就是y偏移了480
    contentInset:The distance that the content view is inset from the enclosing scroll view.是scrollview的contentview的顶点相对于scrollview的位置,例如你的contentInset = (0 ,100),那么你的contentview就是从scrollview的(0 ,100)开始显示

    其实主要的思想是UICollectionViewFlowLayout里的这两个方法

    //当边界发生改变时,是否应该刷新布局。如果YES则在边界变化(一般是scroll到其他地方)时,将重新计算需要的布局信息。
    - (BOOL)shouldInvalidateLayoutForBoundsChange:(CGRect)newBounds
    {
        return YES;
    }
    
    //返回rect中的所有的元素的布局属性
    //返回的是包含UICollectionViewLayoutAttributes的NSArray
    - (NSArray*)layoutAttributesForElementsInRect:(CGRect)rect {
        float offsetY = self.collectionView.contentOffset.y;
        NSArray * attrsArray = [super layoutAttributesForElementsInRect:rect];
        //collectionView的
        float collectionViewFrameHeight = self.collectionView.frame.size.height;
        float collectionViewContentHeight = self.collectionView.contentSize.height;
        float ScrollViewContentInsetBottom = self.collectionView.contentInset.bottom;
        float bottomOffset = offsetY + collectionViewFrameHeight - collectionViewContentHeight - ScrollViewContentInsetBottom;
    //    float numOfItems = self.collectionView.numberOfSections;
        for (_attr in attrsArray) {
            if ([_attr representedElementCategory] == UICollectionElementCategoryCell) {
                CGRect cellRect = _attr.frame;
                if (offsetY <= 0) {
                    float distance = fabs(offsetY) / 10.0;
                    cellRect.origin.y += offsetY + distance * (CGFloat)(_attr.indexPath.row + 1);
                }else if(bottomOffset > 0) {
                    float distance = bottomOffset / 10.0;
                    cellRect.origin.y += bottomOffset - distance *
                    (CGFloat)( _attr.indexPath.row);
                }
                _attr.frame = cellRect;
            }
        }
        return attrsArray;
    }
    

    我写的demo在GitHub上 这个demo里的
    地址:https://github.com/942334790/synthesizeDemo

    1.png

    这几个类是关于 弹簧效果的

    这里边还有TextView 添加placeholder的
    还有第三方SDCycleScrollView的轮播效果的
    大家可以一起看一下

    如果有什么不对的地方欢迎大家告诉我
    我还是希望在iOS这条道路上 我能坚持一直走下去

    相关文章

      网友评论

      本文标题:iOS 弹簧效果(CollectionView实现)

      本文链接:https://www.haomeiwen.com/subject/iybppttx.html