iOS 弹簧效果(CollectionView实现)
这个是我根据@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
这几个类是关于 弹簧效果的
这里边还有TextView 添加placeholder的
还有第三方SDCycleScrollView的轮播效果的
大家可以一起看一下
如果有什么不对的地方欢迎大家告诉我
我还是希望在iOS这条道路上 我能坚持一直走下去