CoreAnimation与UIView.animation...

这两个方式的主要差别在于,前者如果不主动设置,那么在动画做完以后,会恢复原状。
后者则不会,动画做完后是什么样,控件就是什么样。

UIView.animation...是什么

首先我们来做一个动画

UIView.animate(withDuration: 5, animations: {self.moveView.frame.origin.y += 200
})

这个动画是让moveView在Y轴上移动200个点。

  1. 我们在动画代码前,打印一下这个控件的frame信息 (155.0, 140.0, 64.0, 64.0)
  2. 然后我们在动画开始2秒和动画结束时打印一下frame信息,让人疑惑的是结果都为 (155.0, 340.0, 64.0, 64.0)
  3. 我们先停一下,去看看CoreAnimation

CoreAnimation

使用CA动画时,主要是使用的CAAnimation的子类(下面简称 anim )。
anim 是添加到Layer上的,你可以在layer上访问添加到该layer的 anim 。好的,现在我们做一个和上面一样的Y轴上的位移动画。

  1. 在动画开始后的2秒打印一下frame和layer.frame信息,都是 (155.0, 140.0, 64.0, 64.0)
  2. 在2秒时打印animationKeys, Optional(["position"])
  3. 动画结束后,控件恢复到了原状,animationKeys为 nil
  4. 我们把anim改成动画结束后保持结束时状态再看看1-3点的信息
  5. frame和layer.frame信息,也还都是 (155.0, 140.0, 64.0, 64.0)
  6. 在2秒时打印animationKeys, Optional(["position"])
  7. 动画结束后,控件恢复到了原状,animationKeys为 Optional(["position"])
  8. 此时我们使用Xcode的视图调试工具查看,控件位置在 (155.0, 140.0, 64.0, 64.0) ,并且调试界面的位置和APP上的位置完全不一样。

CoreAnimation动画的注意事项

怎么获取正在移动时的位置呢,如果有一个需求是要拿到实际运动的位置,该怎么办?
使用 presentation 属性
在CA动画里,所有的实时状态都会反应到这个属性返回的layer上,本体layer在动画时会被 隐藏 !

  1. 现在我们根据刚才的 anim 动画查看一下 presentation 的信息。
  2. 果然,控件位置的实时信息是反应在这个layer上的

回过来看UIView.animation...

我们在动画进行时打印 presentation 的信息,打印的frame信息竟然能够正确反应当前控件的位置情况。
我们再打印 animationKeys 信息看看, Optional(["position"])
我想答案已经呼之欲出了。 UIView.animation... 使用的是 CoreAnimation 在做动画,只是细节对程序员隐藏了。

两者的区别上需要注意的地方

但是还有一个问题,刚才的打印结果,_UIView.animation..._ 结束后,frame信息为 (155.0, 340.0, 64.0, 64.0) ,而 anim 结束后为 (155.0, 140.0, 64.0, 64.0) ,但是 animpresentation 的frame却是正确的。
这意味着你如果要在 anim 动画后让控件移动到正确的位置,你需要把控件的frame也设置到正确到位置,而不只是在 anim 上设置。
那什么时候设置是一个正确到时机呢?我们注意到,在开始做动画到时候,屏幕上现实的视图,实际上是显示的 presentation 的信息,而不依赖于控件本身的layer。所以在做动画前后都能去设置控件本身到正确的属性。

关于iOS里的做动画方法的差别与注意事项相关推荐

  1. ios开发——使用CALayer和Core Animation做动画效果

    一. CALayer (一). CALayer简介 在iOS中,你能看得见摸得着的东西基本上都是UIView,比如一个按钮.一个文本标签.一个文本输入框.一个图标等等,这些都是UIView,其实UIV ...

  2. dw怎么做html表格,DW里怎么做表格呢?用DW做表格的详细方法

    进入到页面之后,把鼠标定位到 的中间,或者也可以自己选择把页面上的代码都删除了,这个对我们做网店装修没有影响 点击一下菜单栏里的"插入"-"表格",设置相关的参 ...

  3. iOS 自定义转场动画浅谈

    代码地址如下: http://www.demodashi.com/demo/11612.html 路漫漫其修远兮,吾将上下而求索 前记 想研究自定义转场动画很久了,时间就像海绵,挤一挤还是有的,花了差 ...

  4. iOS笔记054 - 核心动画

    注意事项 :locationInView和translationInView // 返回相对于控件自身内部触摸点的位置 [pan locationInView:self]; // 返回两个触摸点之间的 ...

  5. [UWP]用Shape做动画(2):使用与扩展PointAnimation

    上一篇几乎都在说DoubleAnimation的应用,这篇说说PointAnimation. 1. 使用PointAnimation 使用PointAnimation可以让Shape变形,但实际上没看 ...

  6. iOS - Core Animation 核心动画

    1.UIView 动画 具体讲解见 iOS - UIView 动画 2.UIImageView 动画 具体讲解见 iOS - UIImageView 动画 3.CADisplayLink 定时器 具体 ...

  7. iOS 实现启动屏动画(Swift实现,包含图片适配)

    代码地址如下: http://www.demodashi.com/demo/12090.html 准备工作 首先我们需要确定作为宣传的图片的宽高比,这个一般是与 UI 确定的.一般启动屏展示会有上下两 ...

  8. iOS开发之各种动画各种页面切面效果

    转发:http://www.cocoachina.com/ios/20141226/10775.html 今天所介绍的主题是关于动画的,在之前的博客中也有用到动画的地方,今天就好好的总结一下iOS开发 ...

  9. unity2D动画-角色切片与2DAnimation插件做动画

    unity2D动画-角色切片做动画 写在前面的话 开发环境与准备 用角色切片做动画 终于可以Key动画了 2DAnimation插件做动画 总结 写在前面的话 更新 建议有复杂2D动画需求的话用spi ...

最新文章

  1. maven仓库配置和 修改阿里云镜像
  2. map:map指向最后一个元素?指向第一个元素?
  3. VMware安装虚拟机Ubuntu提示piix4_smbus 0000:00:007.3: Host SMBus controller not enabled错误解决办法...
  4. SDNU 1300.转圈游戏(快速幂)
  5. python台风动图绘制_使用Python绘制台风轨迹图的示例代码
  6. 用汇编的眼光看C++(之缺省模板、特化模板)
  7. Docker两种方式进入后台运行的容器
  8. inDesign 教程,如何调整布局元素的大小?
  9. 《激荡三十年》十九、脚下的路——对中国经济未来的猜想
  10. linux打开xml文件,查看 XML 文件
  11. 【产业互联网周报】外媒:英特尔等公司暂停向俄罗斯发货;阿里云季度营收195亿元;第四范式再次提交上市申请...
  12. 奥比中光相机的python采集代码
  13. 计算机学院保研复试题目,电子科大计算机学院2012届保研复试
  14. 安装打印机时提示请反回上一步,使用USB数据线重新连接电脑和打印机
  15. HTML应用程序(HTML Application)
  16. linux版drastic模拟器设置,DraStic nds模拟器下载安装及使用图文教程
  17. 什么是非抢占式和抢占式调度方式?抢占式调度方法和非抢占式调度方法有哪些?
  18. 【ACP】阿里云ACP吐血汇总(一)
  19. 【Mac系列】Alfred配置与使用
  20. php为什么不是三剑客,PHP 开源 CMS 三剑客论剑 SXSW 展会

热门文章

  1. java 运行时类型_Java基础之RTTI 运行时类型识别
  2. 2016 server sql 错误53_MS SQL Server 错误53 错误17是什么?如何解决
  3. android 自定义wifi设置在哪里,Android Wifi的设置、连接操作
  4. Python缩进问题
  5. C#循环给多个控件赋值
  6. CodeForces 1131G. Most Dangerous Shark
  7. mybatis之动态SQL操作之查询
  8. HDU 6029(思维)
  9. java getClass()
  10. 1001. A+B Format (20)---------------PAT开始