dispatch多方法实现连续动画

原创 2016年08月31日 13:04:05

起因:
【我相信大家见到代码比看文字清楚的多。里面的内容也比博客多。
附github链接:https://github.com/OPTJoker/SerialAnimations.git

最近在学习webGL,由于需要一个slider去控制webGL里面3D模型的一些属性,找的库又大有不好用,想自己封装一个模块,于是就开始了html和JS的学习之路。
然后就发现jquery的动画库那么强大,可以串行的执行连续动画。于是想在iOS中实现一下这种效果。
国内没找到什么好资料,有一个人在博客里分享了一种实现方法,不过他用的是关键帧动画,我觉得这种办法太笨,因为要根据动画的播完时间设置delay,那如果有1万个动画,你岂不是要算出1万个delay值?我就呵呵了。
传送门在这:http://www.devtalking.com/articles/uiview-keyframe-animation
在stackoverflow发现了不少干货。于是实现了连播效果,现在来分享一下。

方法一:通过dispatch的group来实现多动画串行执行。
stackoverflow传送门:http://stackoverflow.com/questions/27601758/how-to-use-gcd-to-control-animation-sequence
这个人的答案就是利用dispatch的group实现了多动画的连续播放。
关键代码:

@property (nonatomic, strong) dispatch_queue_t serialQueue;
@property (nonatomic, strong) dispatch_group_t group;

-(void)initQueue {
    // create a serial queue
    self.serialQueue = dispatch_queue_create("com.example.serialQueue", 0);
    // create a dispatch group
    self.group = dispatch_group_create();
}
-(void)animateSyncWithDuration:(NSTimeInterval)duration animations:(block_t)animations {
    dispatch_async(self.serialQueue, ^{
        /*
         * This block is invoked on the serial queue
         * This block would never be executed concurrently
         */

        /*
         * Enter the dispatch group
         */
        dispatch_group_enter(self.group);

        dispatch_async(dispatch_get_main_queue(), ^{
            /*
             * This block is invoked on the main queue
             * It is safe to use UIKit
             */
            [UIView animateWithDuration:duration animations:animations completion:^{
                /*
                 * This completion block is invoked on the main queue
                 * Now leave the dispatch group
                 */
                dispatch_group_leave(self.group);
            }];
        });

        /*
         * Wait until leaving the dispatch group from the UIView animation completion block
         * It means it blocks the serial queue
         */
        dispatch_group_wait(self.group, DISPATCH_TIME_FOREVER);
    });
}

上面的封装完成,就可顺序调用animateSyncWithDuration: animations:来执行动画了。
例:

[self animateSyncDuration:dur animations:^{
    [self changeWidth:ScreenW-40];
}];

[self animateSyncDuration:dur animations:^{
    [self changeHeight:260];
}];

[self animateSyncDuration:dur animations:^{
    [self changeCenter:CGPointMake(ScreenW/2.f, 2*ScreenH/5.f)];
}];

方法二:根据同步异步的性质,用dispatch实现连续动画
分析:既然要按顺序执行多个动画,那就用dispatch_sync先创建要多个同步线程,线程的block穿动画的block。然后把这多个同步线程顺序装进一个异步于main线程的线程来管理,岂不就达到了想要的效果嘛。
这个思路来自于之前做的一个效果:模仿开眼app下面让一段文字一个个逐渐刷出来的效果。
不罗嗦,上代码:
首先typedef一个动画的block类型:

typedef void(^animBlock)(void);

然后根据分析实现线程的逻辑:

- (void)anim:(NSArray *)animArr{
    dispatch_async(dispatch_get_global_queue(0, 0), ^{
        for (short i =0; i<animArr.count; i++) {
            dispatch_sync(dispatch_get_main_queue(), animArr[i]);
        }
    });
}

最后 创建动画数组

//基于异步文字思想的连播动画
- (void)asyncPlayFlash{
    NSMutableArray *animMArr = [[NSMutableArray alloc] initWithCapacity:0];

    animBlock chW = ^{[self changeWidth:ScreenW-40];};
    animBlock chH = ^{[self changeHeight:260];};
    animBlock chP = ^{[self changeCenter:CGPointMake(ScreenW/2.f, 2*ScreenH/5.f)];};

    [animMArr addObject:chW];
    [animMArr addObject:chH];
    [animMArr addObject:chP];

    [self anim:animMArr];
}

就BB这么多,我相信大家见到代码比看文字清楚的多。里面的内容也比博客多。
附github链接:https://github.com/OPTJoker/SerialAnimations.git

相关文章推荐

Swift3.0 单例模式实现的几种方法-Dispatch_Once

今天在写项目时,需要使用单例模式,正常我们的思路是使用GCD的dispatch_once这个API来写,然而在swift3.0中,苹果已经废弃了这个方法,不过不用担心,我们可以用别的方式来实现。结合s...
  • hmh007
  • hmh007
  • 2016年12月26日 13:48
  • 3760

关于JVM中方法调用的相关指令,以及解析(Resolution)和分派(Dispatch)的解释——重载的实现原理与重写的实现原理

JVM中相关方法的调用的指令 invokestatic 调用静态方法。 invokespecial 用于调用构造器方法、私有方法、父类方法。 invokevirtual 用于调用类的所有虚...

qt程序实现多个图片连续显示效果像动画一样

qt学习也快一个月了,最近想做一个有趣的程序。效果是这样的:通过定时器连续显示几幅图片,串联起来看像是动的一样,我在网上找了几幅关于小鸡破壳而出那个有趣的场景,然后通过程序实现效果就是小鸡破壳而出。 ...

三种方法实现最大连续子序列

  • 2012年09月19日 08:02
  • 2KB
  • 下载

【Android】长按连续触发事件的实现方法

项目中需要实现一个类似购物车数量的小组件,需要单击时增加数量,长按时可以连续增大,之前的代码实现效果不理想,google后得到一个解决方法,测试可以完美实现。 实现效果大致如图: 【原理说明】大致...
  • wsgqp
  • wsgqp
  • 2016年08月17日 09:10
  • 1412

【Android】长按连续触发事件的实现方法

项目中需要实现一个类似购物车数量的小组件,需要单击时增加数量,长按时可以连续增大,之前的代码实现效果不理想,google后得到一个解决方法,测试可以完美实现。 实现效果大致如图: 【原理说明】 ...

使用纯net技术实现抓屏(包含连续抓图和鼠标的问题的解决方法)

之前转载了一篇关于api抓屏的实例,本次载的是老外Jason Hensley写的抓屏,实现方式与上次不同,可以方便大家对比 ''开发平台 VB.NET 2005  ''Description: ...
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:dispatch多方法实现连续动画
举报原因:
原因补充:

(最多只允许输入30个字)