美文网首页Kingsly的iOS开发进阶专题iOS开发iOS开发之实战资源
使用CAAnimation打造一个有意思的loading动画

使用CAAnimation打造一个有意思的loading动画

作者: 馒头MT | 来源:发表于2016-04-07 14:04 被阅读450次

项目中遇到一个比较有意思的loading动画需求,最终效果如下:

screenShot.gif
分析

相信很多人跟我一样第一眼被这张图欺骗了,以为是有一个实心圆在做缩放旋转的动画,其实仔细单独观察每个圆形,不难看出,这个loading只是由8个圆形规律的做放大缩小的动画,同时加上了透明度的变化达到了图中的效果,由此我们有了思路:8个圆形,scale animate + opacity animate.

代码实现

我尝试使用最基础的CAAnimation中api来完成想要的效果,由之前的思路,我们首先将缩放动画与透明渐变动画实现出来:

  1. 缩放.我们可以看出每个圆形的缩放比例是经历了 1,0.4,1这三个阶段,当然你也可以理解为0.4,1,0.4,至于为什么是0.4,仅仅是觉的比较好看Orz,并且我们定义动画完成一个循环需要的时间是1s.
  2. 透明渐变. 每个圆形的opacity属性经历了1,0.3,1这三个阶段,同上选中0.3,1,0.3也取决于你的喜好,同样的一个循环时间为1s.
//scale
- (CAKeyframeAnimation *)scaleAnimation {
    CAKeyframeAnimation *scaleAnimate = [CAKeyframeAnimation animationWithKeyPath:@"transform.scale"];
    scaleAnimate.keyTimes = @[@0, @0.5, @1];
    scaleAnimate.values = @[@1, @0.4, @1];
    scaleAnimate.duration = kDuration;
    return scaleAnimate;
}

//opactity
- (CAKeyframeAnimation *)opactityAnimation {
    CAKeyframeAnimation *opacityAnimaton = [CAKeyframeAnimation animationWithKeyPath:@"opacity"];
    opacityAnimaton.keyTimes = @[@0, @0.5, @1];
    opacityAnimaton.values = @[@1, @0.3, @1];
    opacityAnimaton.duration = kDuration;
    return opacityAnimaton;
}

接下来我们使用CAAnimationGroup来包装这两个动画:

CAAnimationGroup *animation = [[CAAnimationGroup alloc] init];
    animation.animations = @[[self scaleAnimation], [self opactityAnimation]];
    animation.timingFunction = [CAMediaTimingFunction functionWithName:kCAMediaTimingFunctionLinear];
    animation.duration = 1.f;
    animation.repeatCount = HUGE;
    animation.removedOnCompletion = NO;

最后的步骤,按照圆形排列绘制8个原点,我们可以使用CAShapeLayerUIBszierPath结合来绘制圆形图案,代码都非常简单,不做更多解读了,至于8个图形的摆放位置这里可能需要一点高中数学知识了:

    for (int i = 0; i < 8; i++) {
        CALayer *circle = [self circleLayerWithAngle:M_PI_4 * i size:circleSize origin:CGPointMake(x, y) containerSize:size color:tintColor];
        
        animation.beginTime = beginTime + i * 0.12;
        [circle addAnimation:animation forKey:@"animation"];
        [layer addSublayer:circle];
    }  

- (CALayer *)circleLayerWithAngle:(CGFloat)angle size:(CGFloat)size origin:(CGPoint)origin containerSize:(CGSize)containerSize  color:(UIColor *)color{
    CGFloat raduis = containerSize.width * 0.5;
    
    CAShapeLayer *layer = [CAShapeLayer layer];
    UIBezierPath *path = [[UIBezierPath alloc] init];
    
    [path addArcWithCenter:CGPointMake(size * 0.5, size * 0.5) radius:size * 0.5 startAngle:0 endAngle:M_PI * 2 clockwise:NO];
    [path closePath];
    layer.fillColor = color.CGColor;
    layer.path = path.CGPath;
    
    CGRect frame = CGRectMake(origin.x + raduis * (cos(angle) + 1),
                              origin.y + raduis * (sin(angle) + 1),
                              size, size);
    layer.frame = frame;
    return layer;
}

通常,对于这种小的动画我习惯封装成一个单独的animation类,方便在其他地方调用,你可以在这里下载到这个demo.
如有你对本文有什么好的建议,欢迎提出咯

相关文章

  • 使用CAAnimation打造一个有意思的loading动画

    项目中遇到一个比较有意思的loading动画需求,最终效果如下: 分析 相信很多人跟我一样第一眼被这张图欺骗了,以...

  • 【iOS】CoreAnimation

    类继承结构 CAAnimation CAAnimation是一个抽象动画类,是所有动画类的父类,不能直接使用,应该...

  • CAAnimation wiki

    CAAnimation是一个动画抽象类,但是不要直接使用CAAnimation类,而是使用它的子类,如上图所示展示...

  • 动画

    先来一张CAAnimation是一个动画抽象类,但是不要直接使用CAAnimation类,而是使用它的子类,如上图...

  • 动画写名字

    动画:CAAnimation使用 使用动画来写名字! 技术点 { // 先导进#import 头文件 使用CASh...

  • QuartzCore和CoreAnimation

    我们简单介绍过CAAnimation中的几个动画效果,使用CAAnimation中的动画进行简单的参数设置就可以实...

  • 动画集合

    CAAnimation 一个抽象的动画类,可以使用它的子类来实现动画. CAMediaTiming 属性动画 CA...

  • IOS动画学习小记(3)-Core Animation-基础动画

    Core Animation - 基础动画 CAAnimation:核心动画的基础类(不能直接使用),负责动画运行...

  • 面试

    Loading动画:loading 准备了一个loading组件,用来写Loading动画。因为是全局Loadin...

  • iOS的layer和动画

    一、核心动画 CAMediaTiming协议 CAAnimation 核心动画基础类,不能直接使用 CAPrope...

网友评论

  • 清晨日暮:不用这么麻烦,用CAReplicatorLayer很简单就实现了
  • 爱娇虎子:loading 动画 怎样从当前的控制器移除

本文标题:使用CAAnimation打造一个有意思的loading动画

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