项目以及封装iOS DeveloperiOS 开发

iOS 弹簧效果(CollectionView实现)

2016-11-22  本文已影响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这条道路上 我能坚持一直走下去

上一篇下一篇

猜你喜欢

热点阅读