ODRefreshControl是一个刷新的指示器,效果不错.
1 | CGFloat verticalShift = MAX(0, -((kMaxTopRadius + kMaxBottomRadius + kMaxTopPadding + kMaxBottomPadding) + offset)); |
这部分计算了一些接下来用到的值.
currentTopPadding:图像离顶部的距离currentBottomRadius:图像离底部的距离
bottomOrigin:底部半圆的圆心
topOrigin:顶部半圆的圆心
1 | //Top semicircle |
这部分是进行绘制的.先绘制顶部半圆,然后调用 CGPathAddCurveToPoint 方法,将曲线接到顶部半圆的终点,再绘制底部半圆,再用曲线将底部半圆的终点和顶部半圆的起点连接.
这里使用的 CGPathAddCurveToPoint 方法会将路径的当前点和由参数指定的目的点连接,其余两个参数作为控制点,控制曲线的弯曲程度.
CGPathAddArc 方法会绘制一部分圆弧,并且把路径的当前点移到圆弧的终点.
因为使用KVO观察了scrollView
的contentOffset
和contentInset
的值,所以每当这两个值改变的时候-observeValueForKeyPath:ofObject:change:contex:
这个方法就会被调用,这个方法里相应的绘制过程就会被执行.
1 | CGFloat radius = lerp(kMinBottomRadius, kMaxBottomRadius, 0.2); |
这部分负责拉动到临界点然后图像消失的动画.
先创建一个 CABasicAnimation 类的对象,指定动画的类型.
1 | CABasicAnimation *pathMorph = [CABasicAnimation animationWithKeyPath:@"path"]; |
然后设置动画
1 | pathMorph.duration = 0.15; |
再为指定的layer添加动画
1 | [_shapeLayer addAnimation:pathMorph forKey:nil]; |
这样,就可以对其相应的属性添加动画效果.
为shapeLayer的shadowPath属性添加的效果亦同理.
如果要为透明的属性添加效果,那么就可以这样创建 CABasicAnimation :
1 | CABasicAnimation *shapeAlphaAnimation = [CABasicAnimation animationWithKeyPath:@"opacity"]; |