2019独角兽企业重金招聘Python工程师标准>>>

当你改变`CALayer`的一个可做动画的属性,它并不能立刻在屏幕上体现出来。相反,它是从先前的值平滑过渡到新的值。这一切都是默认的行为,你不需要做额外的操作。---- 隐式动画

当你改变一个属性,Core Animation是如何判断动画类型和持续时间的呢?实际上动画执行的时间取决于当前*事务*的设置,动画类型取决于*图层行为*。

事务实际上是Core Animation用来包含一系列属性动画集合的机制,任何用指定事务去改变可以做动画的图层属性都不会立刻发生变化,而是当事务一旦*提交*的时候开始用一个动画过渡到新值。

事务是通过`CATransaction`类来做管理,这个类的设计有些奇怪,不像你从它的命名预期的那样去管理一个简单的事务,而是管理了一叠你不能访问的事务。`CATransaction`没有属性或者实例方法,并且也不能用`+alloc`和`-init`方法创建它。但是可以用`+begin`和`+commit`分别来入栈或者出栈。

任何可以做动画的图层属性都会被添加到栈顶的事务,你可以通过`+setAnimationDuration:`方法设置当前事务的动画时间,或者通过`+animationDuration`方法来获取值(默认0.25秒)。

Core Animation在每个*run loop*周期中自动开始一次新的事务(run loop是iOS负责收集用户输入,处理定时器或者网络事件并且重新绘制屏幕的东西),即使你不显式的用`[CATransaction begin]`开始一次事务,任何在一次run loop循环中属性的改变都会被集中起来,然后做一次0.25秒的动画

注:我们使用当前事务的`+setAnimationDuration:`方法来修改动画时间的时候可能会影响此时刻别的动画,所以我们应该在调整动画之前压入一个新的事务。

示例:

- (void)touchesBegan:(NSSet<UITouch *> *)touches withEvent:(UIEvent *)event{// 开启一个新的事务[CATransaction begin];// 设置动画的持续时间[CATransaction setAnimationDuration:3.0];// 随机颜色CGFloat red = arc4random() / (CGFloat)INT_MAX;CGFloat green = arc4random() / (CGFloat)INT_MAX;CGFloat blue = arc4random() / (CGFloat)INT_MAX;self.colorLayer.backgroundColor = [UIColor colorWithRed:red green:green blue:blue alpha:1.0].CGColor;// 提交动画[CATransaction commit];}

UIView的动画也是使用了“事务”,`CATransaction`的`+begin`和`+commit`方法在`+animateWithDuration:animations:`内部自动调用,这样block中所有属性的改变都会被事务所包含。这样也可以避免开发者由于对`+begin`和`+commit`匹配的失误造成的风险。

基于`UIView`的block的动画允许你在动画结束的时候提供一个完成的动作。`CATranscation`接口提供的`+setCompletionBlock:`方法也有同样的功能。要注意的是:完成的动作执行的快得多,这是因为完成块是在block中事务提交并出栈之后才被执行,既完成动作用的是默认的事务做变换,默认的时间也就变成了0.25秒。

转载于:https://my.oschina.net/yejiexiaobai/blog/804374

CoreAnimation —— CATransaction(隐式动画)相关推荐

  1. IOS开发CALayer隐式动画

    2019独角兽企业重金招聘Python工程师标准>>> 每一个自定义的layer都存在默认的隐私动画,隐式动画默认为1/4秒 @interface DYViewController ...

  2. 动画总结 Core Animation 贝赛尔曲线 显式动画 隐式动画

    Core Animation 接下来详细介绍下动画的各个属性及作用 fromValue: 动画的开始值(Any类型, 根据动画不同可以是CGPoint.NSNumber等) toValue: 动画的结 ...

  3. iOS边练边学--CALayer,非根层隐式动画,钟表练习

    一.CALayer UIView之所以能显示在屏幕上,完全是因为他内部的一个图层 在创建UIView对象时,UIView内部会自动创建一个图层(即CALayer对象),通过UIView的layer属性 ...

  4. Flutter 动画全解析(动画四要素、动画组件、隐式动画组件原理等)

    本文通过拆解 Flutter 中动画的实现方式以及原理来介绍动画实现的整个过程. 1. 动画四要素 动画在各个平台的实现原理都基本相同,是在一段时间内一系列连续变化画面的帧构成的.在 Flutter ...

  5. flutter 隐式动画

    前言 隐式动画简单来说就是用 setState 就能呼唤出来的动画.对于实现了隐式动画的组件,只要Widget被更新,那么一个过渡动画就会自动产生并且播放. 隐式动画和显示动画的区别? 1,隐式动画是 ...

  6. 三 iOS之 CALayer的隐式动画

    隐式动画 什么是图层的隐式动画? 当我们修改CALayer的一些属性,我们可以发现它会有类似动画效果一样的变化,这是图层独有的特性. 这样的特性UIView是没有的,当修改UIView的图层属性,会是 ...

  7. CALayer的使用(圆形头像 锚点 边框 阴影 形变 隐式动画 )

    CALayer简介和一些基本概念: 在iOS中,你能看得见摸得着的东西基本上都是UIView,比如一个按钮.一个文本标签.一个文本输入框.一个图标等等,这些都是UIView.其实UIView之所以能显 ...

  8. 隐式图层动画 (Implicit Layer Animation)

    如果一个图层已经存在于界面上,而且不是一个视图的根图层,使它执行动画就如设置属性一样简单.文档中所说的动画属性的更改会自动解释为要求动态显示变化.换句话说,图层属性更改默认是执行动画的!多个属性的变化 ...

  9. 核心动画(8)显式动画

    核心动画(8)显式动画 显式动画 属性动画 基础动画 CAAnimationDelegate 关键帧动画 虚拟属性 动画组 过渡 隐式过渡 对图层树的动画 自定义动画 在动画过程中取消动画 总结 显式 ...

最新文章

  1. 关于C#应用的授权认证
  2. DB2定时清理归档日志脚本
  3. 程序员版本管理知识 Git 详细整理
  4. Tableau连接Mysql数据库,按钮为灰色
  5. 图的遍历(Java)构造器
  6. asp.net core 使用 AccessControlHelper 控制访问权限
  7. ❤️ 爆肝一个月!JAVA零基础入门总结(下)❤️
  8. 2评分标准多少分_高新企业认定评分标准,需要多少分才能拿到高新认证证书...
  9. udev工作流程简图
  10. College student reflects on getting started in open source(二)
  11. 深度学习VS机器学习——到底什么区别
  12. spring-boot设置静态文件路径
  13. 【Windows10】利用分区助手扩展C盘分区
  14. 暂住证因为什么事件取消了_全面取消暂住证制度 一字之变逾2亿人受益
  15. 码头tsb_码头工人及其内部
  16. 判断视频中是否存在移动物体
  17. xcode7的那些坑-“Your binary is not optimized for iPhone 5” (ITMS-90096) when submitting
  18. java程序员工作中遇到的问题解决记录
  19. openai的gym baseline spiningup 深度强化学习环境安装 手撸gym环境demo
  20. linux,unix,bsd命令收集

热门文章

  1. 深度介绍分布式系统原理与设计
  2. 代码优化实战:我又优化了一百个if else!
  3. 老大批评我不要为了“分库分表”而“分库分表”
  4. 你能说出 Kafka 这些原理吗
  5. 面试官给我挖坑:URI中的 “//” 有什么用?
  6. SpringBoot第十一篇:springboot集成swagger2,构建优雅的Restful API
  7. Spring Cloud第十二篇:断路器监控(Hystrix Dashboard)
  8. 贝叶斯机器学习:经典模型与代码实现!
  9. 计算机图形学入门总结!
  10. 关于大数据的完整讲解