关于iOS里的做动画方法的差别与注意事项
CoreAnimation与UIView.animation...
这两个方式的主要差别在于,前者如果不主动设置,那么在动画做完以后,会恢复原状。
后者则不会,动画做完后是什么样,控件就是什么样。
UIView.animation...是什么
首先我们来做一个动画
UIView.animate(withDuration: 5, animations: {self.moveView.frame.origin.y += 200
})
这个动画是让moveView在Y轴上移动200个点。
- 我们在动画代码前,打印一下这个控件的frame信息 (155.0, 140.0, 64.0, 64.0)
- 然后我们在动画开始2秒和动画结束时打印一下frame信息,让人疑惑的是结果都为 (155.0, 340.0, 64.0, 64.0)
- 我们先停一下,去看看CoreAnimation
CoreAnimation
使用CA动画时,主要是使用的CAAnimation的子类(下面简称 anim )。
anim 是添加到Layer上的,你可以在layer上访问添加到该layer的 anim 。好的,现在我们做一个和上面一样的Y轴上的位移动画。
- 在动画开始后的2秒打印一下frame和layer.frame信息,都是 (155.0, 140.0, 64.0, 64.0)
- 在2秒时打印animationKeys, Optional(["position"])
- 动画结束后,控件恢复到了原状,animationKeys为 nil
- 我们把anim改成动画结束后保持结束时状态再看看1-3点的信息
- frame和layer.frame信息,也还都是 (155.0, 140.0, 64.0, 64.0)
- 在2秒时打印animationKeys, Optional(["position"])
- 动画结束后,控件恢复到了原状,animationKeys为 Optional(["position"])
- 此时我们使用Xcode的视图调试工具查看,控件位置在 (155.0, 140.0, 64.0, 64.0) ,并且调试界面的位置和APP上的位置完全不一样。
CoreAnimation动画的注意事项
怎么获取正在移动时的位置呢,如果有一个需求是要拿到实际运动的位置,该怎么办?
使用 presentation 属性
在CA动画里,所有的实时状态都会反应到这个属性返回的layer上,本体layer在动画时会被 隐藏 !
- 现在我们根据刚才的 anim 动画查看一下 presentation 的信息。
- 果然,控件位置的实时信息是反应在这个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) ,但是 anim 的 presentation 的frame却是正确的。
这意味着你如果要在 anim 动画后让控件移动到正确的位置,你需要把控件的frame也设置到正确到位置,而不只是在 anim 上设置。
那什么时候设置是一个正确到时机呢?我们注意到,在开始做动画到时候,屏幕上现实的视图,实际上是显示的 presentation 的信息,而不依赖于控件本身的layer。所以在做动画前后都能去设置控件本身到正确的属性。
关于iOS里的做动画方法的差别与注意事项相关推荐
- ios开发——使用CALayer和Core Animation做动画效果
一. CALayer (一). CALayer简介 在iOS中,你能看得见摸得着的东西基本上都是UIView,比如一个按钮.一个文本标签.一个文本输入框.一个图标等等,这些都是UIView,其实UIV ...
- dw怎么做html表格,DW里怎么做表格呢?用DW做表格的详细方法
进入到页面之后,把鼠标定位到 的中间,或者也可以自己选择把页面上的代码都删除了,这个对我们做网店装修没有影响 点击一下菜单栏里的"插入"-"表格",设置相关的参 ...
- iOS 自定义转场动画浅谈
代码地址如下: http://www.demodashi.com/demo/11612.html 路漫漫其修远兮,吾将上下而求索 前记 想研究自定义转场动画很久了,时间就像海绵,挤一挤还是有的,花了差 ...
- iOS笔记054 - 核心动画
注意事项 :locationInView和translationInView // 返回相对于控件自身内部触摸点的位置 [pan locationInView:self]; // 返回两个触摸点之间的 ...
- [UWP]用Shape做动画(2):使用与扩展PointAnimation
上一篇几乎都在说DoubleAnimation的应用,这篇说说PointAnimation. 1. 使用PointAnimation 使用PointAnimation可以让Shape变形,但实际上没看 ...
- iOS - Core Animation 核心动画
1.UIView 动画 具体讲解见 iOS - UIView 动画 2.UIImageView 动画 具体讲解见 iOS - UIImageView 动画 3.CADisplayLink 定时器 具体 ...
- iOS 实现启动屏动画(Swift实现,包含图片适配)
代码地址如下: http://www.demodashi.com/demo/12090.html 准备工作 首先我们需要确定作为宣传的图片的宽高比,这个一般是与 UI 确定的.一般启动屏展示会有上下两 ...
- iOS开发之各种动画各种页面切面效果
转发:http://www.cocoachina.com/ios/20141226/10775.html 今天所介绍的主题是关于动画的,在之前的博客中也有用到动画的地方,今天就好好的总结一下iOS开发 ...
- unity2D动画-角色切片与2DAnimation插件做动画
unity2D动画-角色切片做动画 写在前面的话 开发环境与准备 用角色切片做动画 终于可以Key动画了 2DAnimation插件做动画 总结 写在前面的话 更新 建议有复杂2D动画需求的话用spi ...
最新文章
- maven仓库配置和 修改阿里云镜像
- map:map指向最后一个元素?指向第一个元素?
- VMware安装虚拟机Ubuntu提示piix4_smbus 0000:00:007.3: Host SMBus controller not enabled错误解决办法...
- SDNU 1300.转圈游戏(快速幂)
- python台风动图绘制_使用Python绘制台风轨迹图的示例代码
- 用汇编的眼光看C++(之缺省模板、特化模板)
- Docker两种方式进入后台运行的容器
- inDesign 教程,如何调整布局元素的大小?
- 《激荡三十年》十九、脚下的路——对中国经济未来的猜想
- linux打开xml文件,查看 XML 文件
- 【产业互联网周报】外媒:英特尔等公司暂停向俄罗斯发货;阿里云季度营收195亿元;第四范式再次提交上市申请...
- 奥比中光相机的python采集代码
- 计算机学院保研复试题目,电子科大计算机学院2012届保研复试
- 安装打印机时提示请反回上一步,使用USB数据线重新连接电脑和打印机
- HTML应用程序(HTML Application)
- linux版drastic模拟器设置,DraStic nds模拟器下载安装及使用图文教程
- 什么是非抢占式和抢占式调度方式?抢占式调度方法和非抢占式调度方法有哪些?
- 【ACP】阿里云ACP吐血汇总(一)
- 【Mac系列】Alfred配置与使用
- php为什么不是三剑客,PHP 开源 CMS 三剑客论剑 SXSW 展会
热门文章
- java 运行时类型_Java基础之RTTI 运行时类型识别
- 2016 server sql 错误53_MS SQL Server 错误53 错误17是什么?如何解决
- android 自定义wifi设置在哪里,Android Wifi的设置、连接操作
- Python缩进问题
- C#循环给多个控件赋值
- CodeForces 1131G. Most Dangerous Shark
- mybatis之动态SQL操作之查询
- HDU 6029(思维)
- java getClass()
- 1001. A+B Format (20)---------------PAT开始