前言


本次分享将从以下方面进行展开:

  1. 曾被面试官问倒过的问题:层与视图的关系
  2. CALayer类介绍及层与视图的关系
  3. CAShapeLayer类介绍
  4. UIBezierPath贝塞尔曲线讲解
  5. CoreAnimation之动画子类介绍
  6. CATransitionAnimation类实现各种过滤动画

关于Core AnimationiOS系统中的关系图如下:


可以看出,Core Animation是相对上层的封装,介于UIKitCore GraphicsOpenGL/OpenGL ES之间。最底下还有一个Graphics Hardware,就是硬件了!!!

层与视图的关系


我们先看看WindowLayer之间的关系:

这个图告诉我们,层是基于绘画模型实现的,层并不会在我们的app中做什么事,实际上是层只是捕获app所提供的内容,并缓存成bitmap,当任何与层关联的属性值发生变化时,Core Animation就会将新的bitmap传给绘图硬件,并根据新的位图更新显示。

UIViewiOS系统中界面元素的基础,所有的界面元素都是继承自UIView。它本身完全是由CoreAnimation来实现的。它真正的绘图部分,是由一个CALayer类来管理。UIView本身更像是一个CALayer的管理器,访问它的跟绘图和跟坐标有关的属性,例如framebounds等,实际上内部都是在访问它所包含的CALayer的相关属性。

提示:layer-based drawing不同于view-based drawing,后者的性能消耗是很高的,它是在主线程上直接通过CPU完成的,而且通常是在-drawRect:中绘制动画。

UIView与CALayer的联系

我们看看UIViewlayer之间的关系图:

我们可以看到,一个UIView默认就包含一个layer属性,而layer是可以包含sublayer的,因此形成了图层树。从此图可以看出这两者的关系:视图包含一个layer属性且这个layer属性可以包含很多个sublayer

有人说UIView就像一个画板,而layer就像画布,一个画板上可以有很多块画布,但是画布不能有画板。

UIView与CALayer的主要区别

  1. UIView是可以响应事件的,但是CALayer不能响应事件
  2. UIView主要负责管理内容,而CALayer主要负责渲染和呈现。如果没有CALayer,我们是看不到内容的。
  3. CALayer维护着三个layer tree,分别是presentLayer TreemodeLayer TreeRender Tree,在做动画的时候,我们修改动画的属性,其实是修改presentLayer的属性值,而最终展示在界面上的其实是提供UIViewmodelLayer

官方说明了UIViewCALayer的联系:

Layers are not a replacement for your app’s views—that is, you cannot create a visual interface based solely on layer objects. Layers provide infrastructure for your views. Specifically, layers make it easier and more efficient to draw and animate the contents of views and maintain high frame rates while doing so. However, there are many things that layers do not do. Layers do not handle events, draw content, participate in the responder chain, or do many other things. For this reason, every app must still have one or more views to handle those kinds of interactions.

说说CALayer


我们首先得明确LayeriOS系统上的坐标系起点是在左上角的,而在OS X系统上是左下角的:

笔者对Layer相关的属性和方法画了这么一张图:

看看官方关于Layer Tree的说明:

关于这一节,请阅读iOS CALayer解读,文章末尾有Demo可以下载运行看效果。

说说UIBezierPath


关于这一节,请阅读iOS UIBezierPath解读,文章末尾有Demo可以下载运行看效果。

说说CAShapeLayer


关于这一节,请阅读iOS CAShapeLayer解读,文章末尾有Demo可以下载运行看效果。

Core Animation介绍


我们在开发中常见的动画:

笔者将Core Animation的关系图及相关属性、方法说明都通过该图来表达:

如果我们要改变动画的行为,我们可以实现CAAction协议的方法,像这样:

- (id<CAAction>)actionForLayer:(CALayer *)theLayerforKey:(NSString *)theKey {CATransition *theAnimation=nil;if ([theKey isEqualToString:@"contents"]) {theAnimation = [[CATransition alloc] init];theAnimation.duration = 1.0;theAnimation.timingFunction = [CAMediaTimingFunction functionWithName:kCAMediaTimingFunctionEaseIn];theAnimation.type = kCATransitionPush;theAnimation.subtype = kCATransitionFromRight;}return theAnimation;
}

参考文档


参考官方文档:iOS CoreAnimation

阅读原文

关注我


微信公众号:iOSDevShares
有问必答QQ群:324400294

Core Animation基础相关推荐

  1. Core Animation之多种动画效果

    前面介绍了Core Animation基础知识,还有CALayer的简单使用,最终还是有要动画的滴,这里列出几个动画效果,参考下能加深对Core Animation的认识和理解 1.把图片移到右下角变 ...

  2. iOS开发:Core Animation编程指南

    关于Core Animation Core Animation是iOS与OS X平台上负责图形渲染与动画的基础设施.Core Animation可以动画视图和其他的可视元素.Core Animatio ...

  3. Core Animation的使用

    关于Core Animation Core Animation是IOS和OS X的图形渲染和动画的基础设施,你可以使用它来进行动画绘制视图和其他APP的可视元素.Core Animation为你完成大 ...

  4. Core Animation 文档翻译 (第二篇)—核心动画基础要素

    前言 核心动画为我们APP内Views动画和其他可视化元素动画提供了综合性的实现体系.核心动画不是我们APP内Views的替代品,相反,它是一种结合Views来提供更好性能和支持Content动画的技 ...

  5. Core Animation

    iOS 核心动画高级技术 核心动画是基于苹果iOS用户界面的技术.通过使用核心动画的全部功能,可以用2D和3D视觉效果来提升应用程序并创造炫酷的全新接口. iOS开发者尼克·洛克伍德会带你一步一步体验 ...

  6. CORE ANIMATION的学习备忘录

    CORE ANIMATION的学习备忘录(第一天) 研究Core Animation已经有段时间了,关于Core Animation,网上没什么好的介绍.苹果网站上有篇专门的总结性介绍,但是似乎原理性 ...

  7. 图层几何学 -- iOS Core Animation 系列二

    <图层树和寄宿图 -- iOS Core Animation 系列一>介绍了图层的基础知识和一些属性方法.这篇主要内容是学习下图层在父图层上怎么控制位置和尺寸的. 1.布局 首先看一张例图 ...

  8. (转) Core Animation 简介

    原文出处:(http://hi.baidu.com/zijian0428/blog/item/6085e5fe8ff987225d60083b.html) 1.    简介 Core animatio ...

  9. iOS——Core Animation 知识摘抄(二)

    阴影 主要是shadowOpacity .shadowColor.shadowOffset和shadowRadius四个属性 shadowPath属性 我们已经知道图层阴影并不总是方的,而是从图层内容 ...

最新文章

  1. 华人博士拿下ACM SIGSOFT杰出博士论文奖,师从北大谢涛教授
  2. python3 pycharm 断点调试 报错 greenlet.error: cannot switch to a different thread
  3. php curl重用,使用PHP CURL解析负载较重的站点?
  4. 项目中遇到难题一 : 多条件筛选(同一本小说具有多个特征)
  5. 机器学习超级复习笔记
  6. string 转 json_手写Json解析器学习心得
  7. 对象入参指定泛型类型_如何得到正确的MethodInfo对象当一个类使用泛型和泛型类型参数...
  8. 重识JavaScript 之 数据类型的相互转换
  9. Ubuntu 深圳活动有感兴趣的朋友吗?
  10. 互联网大数据对教育的重要性
  11. bin文件查看器app_腾讯文件:腾讯官方出品的微信 / QQ 文件管理和清理利器
  12. php pop3,php使用smtp,pop3协议收发邮件代码
  13. 柱状图之最大矩形面积
  14. 【PM模块】基础概念简介
  15. celery任务队列
  16. 【C++要笑着学】多态 | 重写(覆盖) | 协变构多态 | 父虚子非虚也构多态 | final与override关键字(C++11) | 抽象类 | 纯虚函数 | 抽象类指针
  17. codeforces1463 D. Pairs
  18. 火力全开,重新定义蓝牙耳机!新一代南卡OE Pro不入耳式蓝牙耳机震撼来袭
  19. Vue3 - 组件通信(父传子)
  20. 庖丁解牛linux内核 百度云,庖丁解牛Linux内核分析笔记-1

热门文章

  1. 从资源管理器中,获取被选择的文件的路径(及文件夹)的API
  2. Java泛型的PECS原则
  3. Jmeter(二)关联
  4. leetcode_Basic Calculator II
  5. Android之选项卡
  6. nginx启动重启停止
  7. 接口向mapper传参数
  8. 机器人三定律真有用?但AI可能并不会遵守
  9. vue router 路由鉴权(非动态路由)
  10. Spring Cloud Config 规范 1