CAMediaTiming ( 时间协议)详解及实例代码

CAMediaTiming ( 时间协议)详解

有一种通过CAAnimation实现的协议叫做CAMediaTiming,也就是CABasicAnimation和CAKeyframeAnimation的基类(指CAAnimation)。像duration,beginTime和repeatCount这些时间相关的属性都在这个类中。大体而言,协议中定义了8个属性,这些属性通过一些方式结合在一起,准确的控制着时间。文档中每个属性只有几句话,所以很有可能在看这篇文章之前你都已经读过了,但是我觉得使用可视化的图形能更好的解释时间。

可视化的CAMediaTiming

为了显示相关属性的不同时间,无论是他们自己还是混合状态,我都会动态的将橙色变为蓝色。下面的块状显示了从开始到结束的动画过程,时间线上每一个标志代表一秒钟。你可以看到时间线上的任意一点,当前颜色即表示动画中的当前时间。比如,duration像下面一样可视。

我们都知道,CALayer和CAAnimation都实现了CAMediaTiming 协议,因此在Core Animation中,理解CAMediaTiming协议中的属性是非常必要的,但是苹果的文档中对于各个属性描述太简单,对初学者容易理解,这篇文章主要帮助理解CAMediaTiming协议中各个属性的含义。

CAMediaTiming Protocol提供了8个属性,下面将分别讲解。

CAMediaTiming / 时间协议

  1. repeatCount,动画的重复次数,可以设置为小数。设置为HUGE_VALF,表示无限重复。
  2. repeatDuration,动画总时长,如果大于单次时长,则重复;如果小于单次时长,则截断。
  3. duration,单次动画时长。
  4. speed,图层或动画模型相对于父图层CALayer的时间流逝速度。
  5. fillMode,有效期结束后,动画对象的呈现效果是冻结还是移除。
  6. beginTime,相对于父对象的开始时间。注意,以系统的绝对时间为准。例如:
/**
当前时间2秒以后开始动画
*/
keyFrameAnim.beginTime = CACurrentMediaTime() + 2;
/**
截止到当前时间,动画已经执行了2秒,
注意,如果执行的时间大于动画时长,则表示动画已经执行过。
*/
keyFrameAnim.beginTime = CACurrentMediaTime() - 2;

7.timeOffset,时间轴偏移量。将时间轴移动至偏移位置,再执行整个动画时长。假设动画时长3秒,偏移量为8,则开始位置为8 % 3 = 2,再执行3秒,即在整个时长的1/ 3处结束。

8.CACurrentMediaTime,返回系统当前的绝对时间(从本次开机开始),单位秒。

 /**
 The receiver does not appear until it begins and is removed from the presentation when it is completed.
 */
 kCAFillModeRemoved; // (默认)动画模型的呈现效果直至开始时才显示,并在动画结束后移除。
 /**
 The receiver does not appear until it begins but remains visible in its final state when it is completed.
 */
 kCAFillModeForwards; // 动画模型的呈现效果直至开始时才显示,但在动画结束后仍然显示最后的状态。
 /**
 The receiver appears in its initial state before it begins but is removed from the presentation when it is completed.
 */
 kCAFillModeBackwards; // 动画开始之前,动画模型显示其初始呈现效果,但在动画结束后移除。
 /**
 The receiver appears in its initial state before it begins and remains visible in its final state when it is completed.
 */
 kCAFillModeBoth; // 动画开始之前,动画模型显示其初始呈现效果,并且在动画结束后仍然显示最后的状态。

暂停/继续动画demo

- (IBAction)pauseBtnClicked:(id)sender {
  /**
   判断当前图层对象是否有针对postion属性的动画效果
   */
  if ([self.layer.presentationLayer animationForKey:@"position"]) {
    // 通过绝对时间获取图层的本地时间
    CFTimeInterval localTime = [self.layer convertTime:CACurrentMediaTime() fromLayer:nil];
    /**
     将图层的时间流逝速度设置为0,以暂停动画
     */
    self.layer.speed = 0;
    // 设置图层的时间轴偏移量,为继续动画做准备
    self.layer.timeOffset = localTime;

  }
}

- (IBAction)continueBtnClicked:(id)sender {
  /**
   判断当前图层对象是否有针对postion属性的动画效果
   */
  if ([self.layer.presentationLayer animationForKey:@"position"]) {
    // 获取上次暂停时的时间轴偏移量
    CFTimeInterval timeOffset = self.layer.timeOffset;

    // 重置时间轴偏移量
    self.layer.timeOffset = 0;
    // 速度还原为1
    self.layer.speed = 1;

    // 重置开始时间
#warning 此处严重不理解。
    self.layer.beginTime = 0;

    // 计算暂停时间和当前时间的差值
    CFTimeInterval localTime = [self.layer convertTime:CACurrentMediaTime() fromLayer:nil];
    CFTimeInterval timeSincePause = localTime - timeOffset;

    // 从上一次暂停处开始
    self.layer.beginTime = timeSincePause;
  }
}

感谢阅读,希望能帮助到大家,谢谢大对本站的支持!

(0)

相关推荐

  • iOS中使用schema协议调用APP和使用iframe打开APP的例子

    在iOS中,需要调起一个app可以使用schema协议,这是iOS原生支持的,并且因为iOS系统中都不能使用自己的浏览器内核,所以所有的浏览器都支持,这跟android生态不一样,android是可以自己搞内核的,但是iOS不行. 在iOS中提供了两种在浏览器中打开APP的方法:Smart App Banner和schema协议. Smart App Banner 即通过一个meta 标签,在标签上带上app的信息,和打开后的行为,例如:app-id之类的,代码形如: 复制代码 代码如下: <m

  • iOS开发之路--仿网易抽屉效果

    最终效果图: MainStoryBoard示意图: BeyondViewController.h // // BeyondViewController.h // 19_抽屉效果_仿网易 // // Created by beyond on 14-8-1. // Copyright (c) 2014年 com.beyond. All rights reserved. // #import <UIKit/UIKit.h> #import "LeftTableViewControllerD

  • iOS微信第三方登录实现

    一.接入微信第三方登录准备工作. 移动应用微信登录是基于OAuth2.0协议标准构建的微信OAuth2.0授权登录系统. 在进行微信OAuth2.0授权登录接入之前,在微信开放平台注册开发者帐号,并拥有一个已审核通过的移动应用,并获得相应的AppID和AppSecret,申请微信登录且通过审核后,可开始接入流程.(注意) 1.下载iOS微信SDK. 下载地址 2.将SDK放到工程目录中. 3.补充导入一些依赖框架. 4.添加URL Types 5.添加iOS9 URL Schemes. 注意:如

  • iOS开发中ViewController的页面跳转和弹出模态

    ViewController 页面跳转 从一个Controller跳转到另一个Controller时,一般有以下2种: 1.利用UINavigationController,调用pushViewController,进行跳转:这种采用压栈和出栈的方式,进行Controller的管理.调用popViewControllerAnimated方法可以返回. 复制代码 代码如下: PickImageViewController *ickImageViewController = [[PickImageV

  • iOS开发中WebView的基本使用方法简介

    1.使用UIWebView加载网页 运行XCode 4.3,新建一个Single View Application,命名为WebViewDemo. 2.加载WebView 在ViewController.h添加WebView成员变量和在ViewController.m添加实现 复制代码 代码如下: #import <UIKit/UIKit.h> @interface ViewController : UIViewController {     UIWebView *webView; } @e

  • IOS开发代码分享之用nstimer实现倒计时功能

    用nstimer实现倒计时功能,废话不多说,直接上代码,详细解释请参照注释 // [NSTimer scheduledTimerWithTimeInterval:1.0 target:self selector:@selector(timerFireMethod:) userInfo:nil repeats:YES];   // - (void)timerFireMethod:(NSTimer *)theTimer {     BOOL timeStart = YES;     NSCalend

  • IOS获取各种文件目录路径的方法

    iphone沙箱模型有四个文件夹,分别是什么,永久数据存储一般放在什么位置,得到模拟器的路径的简单方式是什么. documents,tmp,app,Library. (NSHomeDirectory()), 手动保存的文件在documents文件里 Nsuserdefaults保存的文件在tmp文件夹里 1.Documents 目录:您应该将所有de应用程序数据文件写入到这个目录下.这个目录用于存储用户数据或其它应该定期备份的信息. 2.AppName.app 目录:这是应用程序的程序包目录,包

  • iOS开发中实现显示gif图片的方法

    我们知道Gif是由一阵阵画面组成的,而且每一帧画面播放的时常可能会不相等,观察上面两个例子,发现他们都没有对Gif中每一帧的显示时常做处理,这样的结果就是整个Gif中每一帧画面都是以固定的速度向前播放,很显然这并不总会符合需求.   于是自己写一个解析Gif的工具类,解决每一帧画面并遵循每一帧所对应的显示时间进行播放.   程序的思路如下:   1.首先使用ImageIO库中的CGImageSource家在Gif文件.   2.通过CGImageSource获取到Gif文件中的总的帧数,以及每一

  • IOS开发代码分享之设置UISearchBar的背景颜色

    今天用到UISearchBar,之前网上提供的方法已经不能有效的去除掉它的背景色了,修改背景色方法如下: mySearchBar.backgroundColor = RGBACOLOR(249,249,249,1);     mySearchBar.backgroundImage = [self imageWithColor:[UIColor clearColor] size:mySearchBar.bounds.size];   //取消searchbar背景色 - (UIImage *)im

  • iOS内存错误EXC_BAD_ACCESS的解决方法

    iOS开发,最郁闷的莫过于程序毫无征兆地就崩溃了,用bt命令打出调用栈,给出的是一堆系统EXC_BAD_ACCESS的信息,根本没办法定位问题出现在哪里. 首先说一下 EXC_BAD_ACCESS 这个错误,可以这么说,90%的错误来源在于对一个已经释放的对象进行release操作.举一个简单的例子来说明吧,首先看一段Java代码: 复制代码 代码如下: public class Test{ public static void main(String[] args){ String s = "

随机推荐