在CAAnimation中暂停动画

iOS CAAnimation(四)控制动画过程 Timing is an important part of animations, and with Core Animation you specify precise timing information for your animations through the methods and properties of theCAMediaTimingprotocol. Two Cor... 阅读详情

使用CAAnimation做动画时,如果要移除动画可以使用

- (void)removeAnimationForKey:(NSString *)key;
- (void)removeAllAnimations;

移除动画后,根据动画 fillmode 的设置,视图会静止在动画起点或者终点的位置,并且动画再次启动还是从起点开始.
如果想让它暂停在当前位置,继续动画时从当前位置开始继续动画,可以根据暂停动画的时间计算暂停位置,然后继续动画时重新制作新的动画.

//计算当前视图位置
-(void)resetViewWithPosition:(float)position
{
    CGRect rect  = self.animateView.frame;
    if (self.isVertical)
    {

        rect.origin.y = position;
    }
    else
    {
        rect.origin.x  = position;
    }
    self.animateView.frame = rect;
}

//暂停动画
- (void)nx_pauseAnimate
{
    if (!_isStart || _isPause)
    {
        return;
    }

    _isPause = YES;

    [self.animateView.layer removeAllAnimations];
    //动画已经进行的的时间
    _animateTime = _animateTime + [[NSDate date] timeIntervalSince1970] - _startTime;
    //当前的位置
    float pausePosition = [_animation positionWithPauseTime:_animateTime];
    float scap = (self.isVertical ? CGRectGetHeight(self.animateView.frame) :CGRectGetWidth(self.animateView.frame) )/2.;
    [self resetViewWithPosition:(pausePosition -scap)];
}
//继续动画
- (void)nx_resumeAnimate
{
    if (!_isStart || !_isPause)
    {
        return;
    }
    _isPause = NO;    
    //继续动画
    _startTime = [[NSDate date] timeIntervalSince1970];

    NSArray * keyPathArray = [_animation keyPathArrayWithPauseTime:_animateTime];
    CAKeyframeAnimation  * animate = [CAKeyframeAnimation animationWithKeyPath:_animation.keyPath];
    animate.values = keyPathArray;
    animate.duration = _animation.duration - _animateTime;
    [self.animateView.layer addAnimation:animate forKey:_animation.keyPath];
    [self resetViewWithPosition:_endPosition];
}

上面的方法也可以实现,但是每次都要重新创建动画,实在不是高明的方法.其实利用CAAnimation自身的属性,有更方便的方法.首先了解一下需要使用的这些属性

  • beginTime指定了动画开始之前的的延迟时间.这里的延迟从动画添加到可见图层的那一刻开始测量,默认是0(就是说动画会立刻执行).

  • speed是一个时间的倍数,默认1.0,减少它会减慢图层/动画的时间,增加它会加快速度.如果2.0的速度,那么对于一个duration为1的动画,实际上在0.5秒的时候就已经完成了.当这个值为0时,动画静止.

  • timeOffset和beginTime类似,但是和增加beginTime导致的延迟动画不同,增加timeOffset只是让动画快进到某一点,例如,对于一个持续1秒的动画来说,设置timeOffset为0.5意味着动画将从一半的地方开始.

  • beginTime会受speed的影响,timeOffset并不受speed的影响.所以如果你把speed设为2.0,把timeOffset设置为0.5,那么你的动画将从动画最后结束的地方开始,因为1秒的动画实际上被缩短到了0.5秒.然而即使使用了timeOffset让动画从结束的地方开始,它仍然播放了一个完整的时长,这个动画仅仅是循环了一圈,然后从头开始播放.

全局时间

CoreAnimation有一个全局时间的概念,称作马赫时间(“马赫”实际上是 iOS和Mac OS系统内核的命名),它可以通过CACurrentMediaTime()获取.它与NSDate 或 CFAbsoluteTimeGetCurrent()不同, 后两者返回的时钟时间将会会网络时间同步,而CACurrentMediaTime() 是基于内建时钟的,不会因为外部时间变化而变化,这个方法获取到的时间,是手机从开机一直到当前所经过的秒数.

为了暂停在正确的位置以及继续动画时起点的位置正确,需要使用这个马赫时间来计算.

每个CALayer和CAAnimation实例都有自己本地时间的概念,是根据父图层/动画层级关系中的beginTime,timeOffset和speed属性计算。就和转换不同图层之间坐标关系一样,CALayer同样也提供了方法来转换不同图层之间的本地时间。

- (CFTimeInterval)convertTime:(CFTimeInterval)t fromLayer:(CALayer *)l;
- (CFTimeInterval)convertTime:(CFTimeInterval)t toLayer:(CALayer *)l;

暂停/继续动画

利用CAAnimation的属性和全局时间,就可以实现暂停/继续动画了.代码如下:

//暂停动画
- (void)nx_pauseAnimate
{
    if (!_isStart || _isPause)
    {
        return;
    }

    _isPause = YES;

    CFTimeInterval pauseTime = [self.animateView.layer convertTime:CACurrentMediaTime() fromLayer:nil];
    // 设置layer的timeOffset, 在继续操作也会使用到
    self.animateView.layer.timeOffset = pauseTime;
    // local time与parent time的比例为0, 意味着local time暂停了
    self.animateView.layer.speed = 0;
}
//继续动画
- (void)nx_resumeAnimate
{
    if (!_isStart || !_isPause)
    {
        return;
    }
    _isPause = NO;
    // 时间转换
    CFTimeInterval pauseTime = self.animateView.layer.timeOffset;
    // 计算暂停时间
    CFTimeInterval timeSincePause = CACurrentMediaTime() - pauseTime;
    // 取消
    self.animateView.layer.timeOffset = 0;
    // local time相对于parent time世界的beginTime
    self.animateView.layer.beginTime = timeSincePause;
    // 继续
    self.animateView.layer.speed = 1;
}
iOS - 控制动画播放与暂停的CALayer分类 立即下载

相关推荐

微波传感器 - 从原理到实战,解锁非接触感知新维度

本文深入解析微波传感器的工作原理,重点阐述了其基于多普勒效应的非接触感知机制,并对比了红外、超声波等技术的优劣。通过树莓派Pico与RCWL-0516模块的实战案例,展示了如何构建区域入侵检测器,并探讨了微波传感器在智能家居、工业自动化及汽车电子等领域的广阔应用前景。

weixin_29306571的博客 223

ios如何获得停止动画

You need to also set the animationName property to match, and ensure that your delegate function is properly defined: CAAnimationGroup *group = [CAAnimationGroup animation]; group.duration = 2.0f; gr

zzcchunter的专栏 3527

进程间通信的七种方法实战演示!值得收藏!

线程和进程间的通讯(Inter-Process Communication, IPC)是操作系统中的一个重要概念,用于实现不同进程或同一进程中的不同线程之间的数据交换和协调。以下是几个常见的进程间通信的方式:管道、消息队列、共享内存、信号、套接字、信号量、文件映射

十年饮冰,难凉热血,保持热爱,奔赴星海! 2816

CAanimation动画 暂停,继续

停止: let pausedTime = layer.convertTime(CACurrentMediaTime(), fromLayer: nil) layer.speed = 0.0 layer.timeOffset = pausedTime

yongyinmg的专栏 6439

低速信号设计之 ESPI 篇

ESPI 是 Intel 推出的增强型串行外设接口,基于 SPI 发展而来,新增 Reset# 和 Alert# 信号,采用点对点主从通信模型,最高速率达 33MHz,支持半双工与 DMA 传输。 其物理接口含 10 条线路,通信协议分物理层、数据链路层等四层。布局布线需关注信号完整性、电源完整性,还得考虑与 SPI 的兼容性。 ESPI 广泛应用于计算机系统(连接 BIOS、电源管理器等)和工业控制领域,具有引脚少、功耗低等优势,但设计复杂且存在兼容性挑战。

qq_16237389的博客 1379

数据结构——滑动窗口

入:下标为 i 的元素进入窗口,更新相关统计量。如果 i < k−1 则重复第一步更新:更新答案。一般是更新最大值 / 最小值出:下标为 i−k+1 的元素离开窗口,更新相关统计量✔1. 定长子串中元音的最大数目✔2. 找到一个数字的 K 美丽值✔4. 子数组的最大平均数 |方法一:前缀和方法二:滑动窗口7. 得到 K 个黑块的最少涂色次数8. 爱生气的书店老板9. 几乎唯一子数组的最大和10. 长度为 K 子数组中的最大和11. 可获得的最大点数12. 最少交换次数来组合所有的1 ||

qq_68915288的博客 762

iOS【核心动画CAAnimationGroup以及其他】

AJ分享,必须精品   效果: 代码: 很简单,不多说,就是把一堆动画放一起,看代码。 - (void)touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event { // 平移动画 CABasicAnimation *a1 = [CABasicAnimation animation]; a1.

阿俊的博客 552

卷积神经网络-猫狗识别(附源码)

利用python实现一个卷积神经网络,训练猫狗数据集,实现对猫狗图片的预测识别

m0_63223213的博客 2万+

iOS动画-CAAnimation使用详解

理解了隐式动画后,显式动画就更加通俗易懂了。区别于隐式动画的特点,显式动画就是需要我们明确指定类型、时间等参数来实现效果的动画。除此之外,我们也可以创建非线性动画,比如沿着任意一条曲线运动等; 我们平时最常用的也是显式动画,不仅系统为我们的视图提供了UIViewAnimationWithBlock的动画封装,而且我们在熟悉了Core Animation的动画属性后也可以很方便的设置显式动画; 本篇主要内容: 1.iOS动画的分类 2.CAMediaTiming协议 3.CAAnimation基类 4.CA

gcs的博客 2618

图解电动汽车:电动汽车电控系统

电动汽车的电控系统通常包含三个子控制系统 —— 整车控制器、电池管理系统、驱动电机控制器。 整车控制器 VCU 整车控制器 VCU(Vehicle Control Unit)作为电动汽车的中央控制单元,是整个控制系统的核心,也是各个子系统的调控中心。VCU 的主要功能就是协调管理整车的运行状态,包括采集电机及电池状态,采集加速踏板信号、制动踏板信号、执行器及传感器信号,根据驾驶员的意图综合分析做出相应判定后,监控下层的各部件控制器的动作,它负责汽车的正常行驶、制动能量回馈、整车发动机及动力电池的能量管理、.

程序员「阿基米东」的编程之旅 1万+

GD32F130之USART多机通信

简介 在多机通信中,一个从机应该只接收它需要接收的数据,且只应该在它需要接收数据时才检测串口。而始终接收RX线上的数据对从机来说是一种负担。 多机通信硬件设计 远距离方案:RS485 板级方案: 静默模式 静默模式有什么作用? 答:如果 USART 处于静默模式,所有的接收状态标志位将不会被置位。 如何进入静默模式? 答:软件可以通过将 USART_CMD 寄存器中MMCMD 位置 1 使 USART 进入静默模式。 如何从静默模式中唤醒? 答:有两种方式可选,①检测到总线

luliplus的博客 299

CAKeyframeAnimation(一)使用和属性全面解析

CAKeyframeAnimation       关键帧动画,也是CAPropertyAnimation的子类,与CABasicAnimation的区别是:CABasicAnimation只能从一个数值(fromValue)变到另一个数值(toValue),而CAKeyframeAnimation会使用一个NSArray保存这些数值。CABasicAnimation可看做是只有2个关键帧的CA...

欢迎来到Jack的程序世界 6419

Allegro 中复制一部分PCB到另一个PCB中去

引言:自从学了allegro后,我每天快乐地再拉线,一开心肯定出事情。不料今天一高兴,把本来在5层的铜皮直接在4层画起来了。不过,幸好我知道换层,才省了又要画铜皮的时间。好了,开干,如果要将其他层的铜皮换到想要换到的层上,就需要这个命令。

tianpu2320959696的博客 968

Layer动画的停止与恢复

CALayer和CAAnimation都实现了CAMediaTiming 协议,可以通过CALayer 中实现的协议中的属性来控制动画。 停止动画:通过将speed设置为0,并将timeOffset调整到合适的值。 Apple 文档说明/* The rate of the layer. Used to scale parent time to local time, e.g. if rate i

烂笔头 2036

Camera2Demo

在Camera2 的基础上进行封装,使得Camera2一堆初始化逻辑与Activity分离,降低耦合度,完成预览拍照并保存的操作

IMSL CNL 7.0.0 (x86-64)Crack

IMSL CNL 7.0.0 (x86-64)Crack intel的算法库破解文件,这是C++版本的破解文件

iOS之UI高级---CALayer和CAAnimation的混合使用

开篇之前,我的内心是复杂的,因为CALayer和CAAnimation这两个类包含的内容实在太多了。仅仅靠一篇文章不但无法很好的了解,甚至很久以后想要回来查阅时都不好开头。 所以,我决定以关键词的方式来说明,当以后运用到相关知识的时候再根据关键词进行查阅。 PS:以下是两篇很好的文章,通读一遍也就没什么不能理解的了。我上传到我的github上。并且附带了我实践时使用的工程。 传送门: https

Mcy的iOS学习站 682

计算机控制技术及应用

《计算机控制技术及应用》通过总结作者的科研成果和吸收国内外的先进理论、方法和技术,以计算机控制系统的网络化、开放化、智能化和集成化发展趋势为主线索,主要介绍计算机控制系统的基本概念和计算机控制系统的典型形式,计算机控制系统的数学描述与基本分析方法,以及数字PID控制器、最少拍控制系统、达林算法、状态变量设计法等设计方法及其各种改进算法。重点突出计算机控制系统输入输出通道接口的设计方法和典型控制系统的设计案例与实现方法等。

CABasicAnimation暂停\企动

self.isAnimation = true let rotationAnimation = CABasicAnimation.init(keyPath: "transform.rotation.z") rotationAnimation.toValue = NSNumber(value: M_PI * 2.0) rotationAnimation.isRemovedOnCompletion = false //后台不停止 ...

xiaobo0134的专栏 744

文档:亲测可用解决vnc灰屏,黑屏,鼠标大黑叉情况

主要解决vnc-viewer灰屏,黑屏,鼠标大黑叉等现象,详细见文档。

iOS学习笔记-075.核心动画01——简介

核心动画01简介 一Core Animation简介 二核心动画继承结构 三Core Animation的使用步骤 四CAAnimation简介 五CAAnimation动画填充模式 六CAAnimation速度控制函数 七CAAnimation动画代理方法 八CALayer上动画的暂停和恢复 九CAPropertyAnimation核心动画01——简介一、Core Animation简介 Core

qiwenmingshiwo的专栏 467

iOS开发之核心动画(Core Animation)

1、概述 Core Animation是一组非常强大的动画处理API,使用它能做出非常炫丽的动画效果,而且往往是事半功倍,使用它需要先添加QuartzCore.framework和引入对应的框架<QuartzCore/QuartzCore.h>。 特别注意的是核心动画的动画效果只是“假象”,产生动画的那个view实际上并未发生任何变化。 开发...

weixin_33834628的博客 159

CAAnimation抽象类及子类的详解

核心动画的详解介绍:CAAnimation(抽象类)   1、核心动画基本概念 Core Animation是一组非常强大的动画处理API,使用它能做出非常炫丽的动画效果,而且往往是事半功倍! 使用它需要先添加QuartzCore.framework和引入对应的框架 ,在iOS7中不需要   2、动画分类 基本动画    CABasicAnimation 关键帧

1191

iOS基础 - 核心动画

一、核心动画 l 核心动画基本概念 l 基本动画 l 关键帧动画 l 动画组 l 转场动画 l Core Animation是一组非常强大的动画处理API,使用它能做出非常炫丽的动画效果,而且往往是事半功倍! l 使用它需要先添加QuartzCore.framework和引入对应的框架 l 开发步骤: 初始化一个动画对象(CAAnimation)并设置一些动画相关属性CALa

546

核心动画

核心动画标签(空格分隔): ios进阶Core Animation,中文翻译为核心动画,它是一组非常强大的动画处理API,使用它能做出非常炫丽的动画效果,而且往往是事半功倍。也就是说,使用少量的代码就可以实现非常强大的功能。 Core Animation是直接作用在CALayer上的,并非UIView核心动画的框架结构Core Animation的使用步骤如果不是xcode5之后的版本,使用它需要

maomaopanjiu的博客 713

理解CAMediaTiming的beginTime

CALayer和CAAnimation都实现了CAMediaTiming协议。CAMediaTiming协议中有一个beginTime属性。这里记录一些对beginTime属性的理解。 1、全局时间。Core Animation使用一个所谓的全局时间坐标系。这个全局时间坐标系的原点为设备重启完成的那个时刻,当前时间为“现在”距离“起始点”的秒数。CACurrentMediaTime函数即可返回这个秒数。 2、层级和局部时间。layer和animation之间存在父子关系,从而形成层级。另一方面,每个la

Just a coder 701

iOS开发 CoreAnimation

Core Animation是直接作用在CALayer上的(并非UIView上)非常强大的跨Mac OS X和iOS平台的动画处理API,Core Animation的动画执行过程都是在后台操作的,不会阻塞主线程。 核心动画继承结构 核心动画继承结构 注意:核心动画中的虚类不能使用,而应该使用他们子类中的实类。 Core Animation的使用步骤

Bruce__Liu的博客 766

一个基于CAAnimation的动画工具

BinAnimation Link to GitHub 为什么使用 必要性:作为 iOS 开发工程师,在日常的开发工作中,虽然不需要像游戏开发一样设计各式各样酷炫的动画,但是简单的动画开发还是很有必要的。 功能性:动画一方面可以提高用户的视觉体验,另一方面利用动画的过渡时间在后台异步执行功能性代码,降低由于过长的功能性代码执行时间带来不良体验的效果。...

前湖阿宝的博客 294

CALayer动画的暂停,恢复,以及结束时候的回调

CALayer动画的暂停,恢复,以及结束时候的回调 源码如下: // // ViewController.m // AnimationLineView // // Created by YouXianMing on 14/11/7. // Copyright (c) 2014年 YouXianMing. All rights reserved. // ...

weixin_30292745的博客 75

iOS 动画篇(一) Core Animation

  iOS中实现动画有两种方式,一种是自己不断的通过drawRect:方法来绘制,另外一种就是使用核心动画(Core Animation)。   导语:   核心动画提供高帧速率和流畅的动画,而不会增加CPU的负担和减慢你的应用程序。换句话说,使用核心动画你就不用担心性能的事了。同时,使用核心动画只需要提供少数参数,使用起来很简单。需要注意的是核心动画针对的是CALayer而不是UIView,...

weixin_34033624的博客 319
上一篇: UIControl 和 UIGesture增加点击间隔
下一篇: YYImage设计思路
Philm_iOS
博客等级 码龄8年 74粉丝 53原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值