iOS Developer项目以及封装ios开发 小控件

写一个酷炫的iOS进度条动画

2017-01-13  本文已影响4039人  karthus

最近需要写个进度条动画,之前在github上看到JSDownloadView时就想也自己实现一个,于是就去网上找了一下好看的进度条动画素材准备实现以下。

先把原图放一下:


![](http:https://img.haomeiwen.com/i1249505/04140c363a414341.gif?imageMogr2/auto-orient/strip)

第一个进度条出处是这里,第二个进度条是正好在CocoaChina的一篇文章中看到保存下来的没有找到原出处;

一共做了两款进度条,但其实实现的都不是很完美。

这两个动画我完全用的是CoreAimation实现,由于对POP不是很熟悉,不知道如何用POP实现类似CAKeyFrameAnimation的关键帧动画,所以没有采用POP。

具体的实现思路和上面所说的JSDownloadView是类似的,简而言之就是分解组合动画。

1.利用Mac自带的预览可以查看GIF中的一帧帧图像,可以具体观察GIF是如何一步步变化的,方便你拆解组合动画

2.取出几个关键帧方便我们回想动画实现

1.png 2.png 3.png 4.png

3.首先我们需要把初始状态给画出来,先创建两个CAShapeLayer,此处还需要用UIBezierPath画出layer的path,如果不是很熟悉的可以看一下这个文章,写动画的过程中需要绘制大量的贝塞尔曲线

我的想法是circleLayer经过动画后由圆圈变为横线进度条,箭头所用的arrowLayer变为笔,这样动画都在这两个layer上面进行,思路比较清晰

@property (nonatomic, strong) CAShapeLayer *circleLayer; // 圆圈 -> 进度条
@property (nonatomic, strong) CAShapeLayer *arrowLayer; // 箭头 -> 笔

//绘制圆圈
- (UIBezierPath *)circlePath
{
    CGFloat width = self.bounds.size.width;
    CGFloat height = self.bounds.size.height;
    CGRect rect = (CGRect){(width-height)/2,0,height,height};
    return [UIBezierPath bezierPathWithOvalInRect:rect];
}

4.初始状态绘制好之后就需要开始动画,由上面的分解可知:

关于此处用到的UIBezierPath还是提一下把(不熟悉的可以看一下我上面提到的那篇文章):
调用下面这个方法绘制二次贝塞尔曲线,看下图就明白这个方法怎么使用了
-(void)addQuadCurveToPoint:(CGPoint)endPoint controlPoint:(CGPoint)controlPoint;

贝塞尔.png

5.到此处大致的思路和主要的实现方法已经都说完了,收尾和开始的准备动画都是一样的类型,按照其中的动画组合实现即可,动画其中有很多小细节,小动画文章里都没有提到

最终效果:

progress1 progress2failed.gif progress2success.gif

总结一下:

主要使用到的类:CABasicAnimation,CAKeyFrameAnimation,CAAnimationGroup,UIBezierPath
将动画通过Group,beginTime和delegate的方式按顺序组合播放即可完成一系列复杂动画

关于animation的keypath不清楚的可以看这里

相对来说第二个素材的动画更容易实现而且效果更平滑,有时间再写一下把

代码放在github,喜欢的朋友欢迎star

写在最后:看了代码的和实际效果的朋友若有什么改进意见 欢迎探讨,有几个效果实现起来实在差,特别第二个动画下载速度快慢时指示器角度的变化完全没有实现思路。

上一篇下一篇

猜你喜欢

热点阅读