iOS-CALayer上的动画 如何暂停和恢复?

把正在闪烁的动画暂停

-重点看暂停和恢复的操作

这个maskLayer 是你定义的属性(就是你哪个控件在做动画操作)


//开始动画
- (void)startShimmer {
    dispatch_async(dispatch_get_main_queue(), ^{
        // 切换到主线程串行队列,下面代码打包成一个事件(原子操作),加到runloop,就不用担心 isPlaying 被多个线程同时修改
        // dispatch_async() 不 strong 持有本 block,也不用担心循环引用
        if (self.isPlaying == true) return ;
        self.isPlaying = true;
        [self copyLabel:self.maskLabel from:self.contentLabel];
        self.maskLabel.hidden = false;
        [self.maskLayer removeFromSuperlayer];
        [self freshMaskLayer];
        [self.maskLabel.layer addSublayer:self.maskLayer];
        self.maskLabel.layer.mask = self.maskLayer;
        
        switch (self.shimmerType) {
            case ST_LeftToRight: {
                self.maskLayer.transform = self.startT;
                self.translate.fromValue = [NSValue valueWithCATransform3D:self.startT];
                self.translate.toValue = [NSValue valueWithCATransform3D:self.endT];
                [self.maskLayer removeAllAnimations];
                [self.maskLayer addAnimation:self.translate forKey:@"start"];
                break;
            }
            case ST_RightToLeft: {
                self.maskLayer.transform = self.endT;
                self.translate.fromValue = [NSValue valueWithCATransform3D:self.endT];
                self.translate.toValue = [NSValue valueWithCATransform3D:self.startT];
                [self.maskLayer removeAllAnimations];
                [self.maskLayer addAnimation:self.translate forKey:@"start"];
                break;
            }
            case ST_AutoReverse : {
                self.maskLayer.transform = self.startT;
                self.translate.fromValue = [NSValue valueWithCATransform3D:self.startT];
                self.translate.toValue = [NSValue valueWithCATransform3D:self.endT];
                [self.maskLayer removeAllAnimations];
                [self.maskLayer addAnimation:self.translate forKey:@"start"];
                break;
            }
            case ST_ShimmerAll : {
                self.maskLayer.transform = CATransform3DIdentity;
                [self.maskLayer removeAllAnimations];
                [self.maskLayer addAnimation:self.alphaAni forKey:@"start"];
                break;
            }
            default: break;
        }
    });
}


//暂停动画
-(void)pauseLayer{
    dispatch_async(dispatch_get_main_queue(), ^{
        if (self.isPlaying == false) return ;
        self.isPlaying = false;
        CFTimeInterval pausedTime = [self.maskLayer  convertTime:CACurrentMediaTime() fromLayer:nil];
        self.maskLayer.speed = 0.0;
        self.maskLayer.timeOffset = pausedTime;
        
    });
}


//继续动画
-(void)resumeLayer{
    CFTimeInterval pausedTime = [self.maskLayer timeOffset];
    self.maskLayer.speed = 1.0;
    self.maskLayer.timeOffset = 0.0;
    self.maskLayer.beginTime = 0.0;
    CFTimeInterval timeSincePause = [self.maskLayer convertTime:CACurrentMediaTime() fromLayer:nil] - pausedTime;
    self.maskLayer.beginTime = timeSincePause;
}


//结束动画
- (void)stopShimmer {
    dispatch_async(dispatch_get_main_queue(), ^{
        if (self.isPlaying == false) return ;
        self.isPlaying = false;
        
        [self.maskLayer removeAllAnimations];
        [self.maskLayer removeFromSuperlayer];
        self.maskLabel.hidden = true;
    });
}


感谢关注作者!

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容

  • Swift1> Swift和OC的区别1.1> Swift没有地址/指针的概念1.2> 泛型1.3> 类型严谨 对...
    cosWriter阅读 13,796评论 1 32
  • 在iOS中随处都可以看到绚丽的动画效果,实现这些动画的过程并不复杂,今天将带大家一窥iOS动画全貌。在这里你可以看...
    F麦子阅读 10,519评论 5 13
  • 1 CALayer IOS SDK详解之CALayer(一) http://doc.okbase.net/Hell...
    Kevin_Junbaozi阅读 10,573评论 3 23
  • 概览 在iOS中随处都可以看到绚丽的动画效果,实现这些动画的过程并不复杂,今天将带大家一窥iOS动画全貌。在这里你...
    被吹落的风阅读 5,501评论 1 2
  • 在iOS实际开发中常用的动画无非是以下四种:UIView动画,核心动画,帧动画,自定义转场动画。 1.UIView...
    请叫我周小帅阅读 8,368评论 1 23