iOS学习笔记之QuartzCore框架

iOS编程给用户视觉反馈其实都是通过QuartzCore框架来进行的,说白了,所有用户最终看到的显示界面都是图层合成的结果,而图层即是QuartzCore中的CALayer。

通常我们所说的视图即UIView,并不是直接显示在屏幕上,而是在创建视图对象的时候视图对象会自动创建一个层,而视图对象把要显示的东西绘制在层上,待到需要显示时硬件将所有的层拷贝,然后按Z轴的高低合成最终的显示结果。

CALayer本质上是一块包含一幅位图的缓冲区,由视图创建的层为隐式层,而手动创建的层称为显示层。

如果要在iOS上能够有良好的用户体验,动画的过渡效果是必不可少的,而所有的动画效果都是通过CAAnimation类的子类(CAAnimation是抽象类)来完成的。CAAnimation类的子类包括了 CAAnimationGroup,CAPropertyAnimation,CATransition,而CAPropertyAniamtion(同为抽象类)也衍生了CABasicAnimation和CAKeyframeAnimation。用UIView的animation实现的动画本质上也是通过CALayer来实现的,iOS系统中CALayer的很多属性都是隐含有动画效果的,如果不想要隐式动画或者想要显示动画效果,都可以通过CATransaction来设置是否显示动画效果。同时,在CATransaction内可同时修改多个属性,然后再一并同时渲染,另外CATransaction还是可嵌套的。

CABasicAnimation是一个最多只能有两个关键帧的动画,而 CAKeyframeAnimation除了可含有多个关键帧,而且还可以修改每个关键帧的速度。

CATransition能够为层提供移出以及移入屏幕的效果。苹果提供的所有动画类型在http://iphonedevwiki.net/index.php/CATransition这里有介绍,但是api只开放了其中的四种,当然你可以调用未公开的api,但是假如苹果以后出于安全还是什么原因调整接口的话,就不一定能用了,所以最好还是不要调用私有api,况且还有许多可以替代的方法,例如@"flip”,@"pageCurl”这些type是属于未公开的,一般来说不应该调用这些做动画,同样也可实现翻转的效果。再不行的话,还可以通过设置@"transform.rotation.y"这个keypath来旋转,或者直接通过 CATransform3D来设置@"transform”属性。总而言之,没必要用未公开的api,会留下隐患,而且替代的方法很多。

变换过程中需要注意的是该CALayer的anchorPoint,也就是旋转缩放基准点,默认情况下是(0.5, 0.5)也就是在layer的中心。基准点如果变了,旋转或者缩放所得到的的结果将会不同。position和anchorPoint共同决定了CALayer的frame。

再说说CATransform3D的一个很常用到的数值,那就是m34这个值,下面这段代码是从Xcode文档中得到的

1 CATransform3D aTransform.= CATransform3DIdentity;

2 // the value of zDistance affects the sharpness ofthe transform.

3 zDistance = 850;  4aTransform.m34 = 1.0 / -zDistance;   默认情况下, m34的值为0,即zDistance为无穷大,而(0,0,zDistance)点表示照相机(透视点)所在的位置,从照相机位置看到的影像在xy平面上的投影即是我们可以在手机屏幕中所看到的影像,下面的这个链接讲的很详细很准确,有兴趣的可以去看。 http://geeklu.com/2012/07/ios-3d-perspective/    上面讲了iOS里面所有的动画,但是还有一个很重要的没有讲,那就是动画的速度控制函数CAMediaTimingFunction。这个函数是用于描述时间和距离之间的关系,距离=toValue-fromValue,时间=duration, 将它们标准化为1x1的空间,x,t取值在[0, 1]区间内。假设在时刻t(时间过去了duration*t)时,动画目标的位置应为 fromValue+x*(toValue-fromValue)。系统提供的四种函数的函数图如下,下面曲线的斜率表示动画的速率,从图中可以看出,kCAMediaTimingFunctionLinear为匀速运动,kCAMediaTimingFunctionEaseIn为加速运动,kCAMediaTimingFunctionEaseOut为减速运动,kCAMediaTimingFunctionEaseInEaseOut为先加速后减速运动。当然,苹果也提供了可自定义速度控制函数,通过initWithControlPoints:x1:y1:x2:y2

可自定义两个插值点,然后所得的函数曲线为由

(0,0),(x1,y1),(x2,y2),(1,1)

这四个点为控制点的

说了这么多,大概知晓了动画的原理,但是要做出很绚丽的动画还是需要很好地数学功底及勤加修炼的。当然很多时候我们不能为了炫而炫,毕竟很多时候用户使用应用是为了使用某个功能而不是专门来看动画的,所以还需要多多看ios开发书籍。

QuartzCore框架-- iOS中的动画相关推荐

  1. iOS中 Animation 动画大全 韩俊强的博客

    每日更新关注:http://weibo.com/hanjunqiang  新浪微博! iOS开发者交流QQ群: 446310206 1.iOS中我们能看到的控件都是UIView的子类,比如UIButt ...

  2. 谈谈iOS中粘性动画以及果冻效果的实现

    文 / 杨骑滔 在最近做个一个自定义PageControl--KYAnimatedPageControl中,我实现了CALayer的形变动画以及CALayer的弹性动画,效果先过目: 先做个提纲: 第 ...

  3. iOS中字迹动画效果

    最近自己着手一款关于中国风的app,其中需要的一个想法就是诗词可以像ppt中的一种模式:字可以一个个的显示出来.最先的想法是将诗词分成一个个字放在一个个label上面,然后添加动画将其显示出来!然后这 ...

  4. iOS中ImageIO框架详解与应用分析

    2019独角兽企业重金招聘Python工程师标准>>> iOS中ImageIO框架详解与应用分析 一.引言 ImageIO框架提供了读取与写入图片数据的基本方法,使用它可以直接获取到 ...

  5. web 移动端 ios 浏览器中 animation 动画异常

    关键字:animation,ios,移动端,异常 解决问题的办法:页面dom加载完毕时延时给dom加上动画类名.即在vue的mounted钩子中用定时器延时100ms左右给需要动画的dom加上类名. ...

  6. IOS中的AFNetworking框架的GET参数的使用

    IOS中的AFNetworking框架的GET参数的使用 加入ATS在info.plist 中加入ATS代码 <key>NSAppTransportSecurity</key> ...

  7. android imageview 上蒙版,在iOS中为UIImageView的圆形蒙版设置动画

    马特有正确的想法 . 你想要做的是使用Core Animation和CAShapeLayer . 图层具有可选的蒙版属性,该属性控制可见的图层部分 . 您可以添加CAShapeLayer作为另一个图层 ...

  8. ios css动画残影,CSS 过渡动画在IOS中表现异常

    设置了一个隐藏的圆环,在页面开始时旋转露出.发现在IOS(safari)中过渡动画展示不完整,只展示了起始部分,后面直接跳转到结束状态了. demo .wrap { width: 200px; hei ...

  9. C#/WPF入门到多项目实战开发教程1——Grid、自定义按钮模板、WPF框架中的动画

    视频地址:https://www.bilibili.com/video/BV13U4y1e7fx?p=8&spm_id_from=pageDriver&vd_source=5dc01f ...

最新文章

  1. 大厂程序员和北京户口教师女友买房分歧,要求分配产权怕离婚扯皮
  2. CSAPP(8):系统级IO
  3. 【译】在Android中保护数据-加密大数据
  4. 用100行python代码发现语音识别文本错误词,并将结果和正确词一一对应
  5. 用ASP.NET Core 2.0 建立规范的 REST API -- 预备知识
  6. CSS3 弹性布局盒模型 Flex布局
  7. 说说你对Jdk并发包中的CAS实现的了解?
  8. 计算机组成原理核心总结
  9. mysql update 子表,mysql update 子查询锁表问题
  10. 小学计算机课flash的教案,信息技术flash教案
  11. ARP攻击实战以及防御手段
  12. STM32F401标准固件库配置
  13. 树莓派3安装系统linux,树莓派3 安装Fyde OS
  14. 计算机软件著作权登记范文,计算机软件著作权登记申请表范本
  15. 推荐一位 10w+ 粉丝的 Python 工程师
  16. Facebook登录-前端网页以及在angular中的使用方法
  17. 智能存储 | 承载万花筒视频世界,玩转广电传媒“小众”格式
  18. js之生成并下载txt文件
  19. 黑苹果活动监视器闪退的解决办法
  20. 你真的不想知道录音如何转文字吗

热门文章

  1. Nature Protocols:整合宏基因组、代谢组和表型分析的的计算框架
  2. pandas编写自定义函数计算多个数据列的加和(sum)、使用groupby函数和apply函数聚合计算分组内多个数据列的加和
  3. R语言union函数计算数据对象(vector、list、dataframe)的并集:union函数计算两个vector向量、dataframe、列表list的并集
  4. R语言ggplot2可视化:使用ggrepel包在线图(line plot)的尾端那个数据点添加文本标签(text label)
  5. Scala error: type mismatch; found : java.util.List[?0] required: java.util.List[B]
  6. OCR引擎Tesseract以及pytesseract详解及实例
  7. AdaBoostClassifer详解及实战
  8. 精益数据分析(学习笔记)——长期更新
  9. Linux下如何查看硬件信息?
  10. C语言中within函数,vfprintf() - C语言库函数