CALayer和UIView
前言
本次分享将从以下方面进行展开:
- 曾被面试官问倒过的问题:层与视图的关系
CALayer
类介绍及层与视图的关系CAShapeLayer
类介绍UIBezierPath
贝塞尔曲线讲解CoreAnimation
之动画子类介绍CATransitionAnimation
类实现各种过滤动画
关于Core Animation
在iOS
系统中的关系图如下:
可以看出,Core Animation
是相对上层的封装,介于UIKit
与Core Graphics
、OpenGL/OpenGL ES
之间。最底下还有一个Graphics Hardware
,就是硬件了!!!
层与视图的关系
我们先看看Window
与Layer
之间的关系:
这个图告诉我们,层是基于绘画模型实现的,层并不会在我们的app
中做什么事,实际上是层只是捕获app
所提供的内容,并缓存成bitmap
,当任何与层关联的属性值发生变化时,Core Animation
就会将新的bitmap
传给绘图硬件,并根据新的位图更新显示。
UIView
是iOS
系统中界面元素的基础,所有的界面元素都是继承自UIView
。它本身完全是由CoreAnimation
来实现的。它真正的绘图部分,是由一个CALayer
类来管理。UIView
本身更像是一个CALayer
的管理器,访问它的跟绘图和跟坐标有关的属性,例如frame
、bounds
等,实际上内部都是在访问它所包含的CALayer
的相关属性。
提示:
layer-based drawing
不同于view-based drawing
,后者的性能消耗是很高的,它是在主线程上直接通过CPU
完成的,而且通常是在-drawRect:
中绘制动画。
UIView与CALayer的联系
我们看看UIView
与layer
之间的关系图:
我们可以看到,一个UIView
默认就包含一个layer
属性,而layer
是可以包含sublayer
的,因此形成了图层树。从此图可以看出这两者的关系:视图包含一个layer
属性且这个layer
属性可以包含很多个sublayer
。
有人说UIView
就像一个画板,而layer
就像画布,一个画板上可以有很多块画布,但是画布不能有画板。
UIView与CALayer的主要区别
UIView
是可以响应事件的,但是CALayer
不能响应事件UIView
主要负责管理内容,而CALayer
主要负责渲染和呈现。如果没有CALayer
,我们是看不到内容的。CALayer
维护着三个layer tree
,分别是presentLayer Tree
、modeLayer Tree
、Render Tree
,在做动画的时候,我们修改动画的属性,其实是修改presentLayer
的属性值,而最终展示在界面上的其实是提供UIView
的modelLayer
。
官方说明了UIView
与CALayer
的联系:
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
我们首先得明确Layer
在iOS
系统上的坐标系起点是在左上角的,而在OS X
系统上是左下角的:
笔者对Layer
相关的属性和方法画了这么一张图:
看看官方关于Layer Tree
的说明:
。
Core Animation介绍
我们在开发中常见的动画:
笔者将Core Animation
的关系图及相关属性、方法说明都通过该图来表达:
如果我们要改变动画的行为,我们可以实现CAAction
协议的方法,像这样:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
|
- (id<CAAction>)actionForLayer:(CALayer *)theLayer
forKey:(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;
}
|
CALayer和UIView的更多相关文章
- 详解CALayer 和 UIView的区别和联系
详解CALayer 和 UIView的区别和联系 前言 前面发了一篇iOS 面试的文章,在说到 UIView 和 CALayer 的区别和联系的时候,被喵神指出没有切中要点,所以这里就 CALay ...
- IOS开发-CALayer和UIView详细汇总
1. CALayer和UIView之间的关系: 在iOS系统中,你能看得见摸得着的东西基本上都是UIView,比如UI控件.图标等等,都是UIView. 其实UIView之所以能显示在屏幕上,完 ...
- CALayer与UIView的关系
CALayer属于Core Animation部分的内容,比较重要而不太好理解.以下是园子中看到的一篇文章的摘录: 1. UIView是iOS系统中界面元素的基础,所有的界面元素都是继承自它.它本身完 ...
- 详解 CALayer 和 UIView 的区别和联系
http://www.cocoachina.com/ios/20150828/13244.html 作者:@武蕴牛x 授权本站转载. 前言 前面发了一篇iOS 面试的文章,在说到 UIView 和 C ...
- iOS 之 CALayer与UIView的区别
最大区别:CALayer (图层)不会直接渲染到屏幕上. UIView是iOS系统中界面元素的基础,所有的界面元素都继承自它.它本身完全是由CoreAnimation来实现的. 真正的绘图部分,是由一 ...
- iOS核心动画CALayer和UIView
UIView和CALayer的关系. 每一个UIview都有一个CALayer实例的图层属性,也就是所谓的backing layer. 实际上这些背后关联的图层才是真正用来在屏幕上显示和做动画,UIV ...
- UIView CALayer 的区别
UIView与CALayer的区别,很详细 研究Core Animation已经有段时间了,关于Core Animation,网上没什么好的介绍.苹果网站上有篇专门的总结性介绍,但是似乎原理性的东西不 ...
- UIView和CALayer的区别
CALayer属于Core Animation部分的内容,比较重要而不太好理解.以下是园子中看到的一篇文章的摘录: 以下摘自<<核心动画编程指南>>: 两者最大的区别是,图层不 ...
- UIView 与 CALayer
联系: 1. UIView 有个属性 layer,可以返回它的主 CALayer 实例:CALayer *layer = myView.layer 2. 一个 UIView 可以有多个 CALayer ...
随机推荐
- Xcode6 pch文件
XCode6里, 默认是没有pch文件的,如果我们想使用pch文件,需要手动添加,添加步骤如下 1.在XCode6中是么有pch文件的,如下图 2.创建pch文件 3.配置pch文件 ...
- 枚举型变量 ErrorStatus HSEStartUpStatus及使用
ErrorStatus和C语言中的int .char一样,后面定义的HSEStartUpStatus是这个变量.举例,你的ErrorStatus 代表bool类型的0或者1. typedef enum ...
- 计算机操作系统处理机调度读后感—–关于进程概念的剖析。从RING3到RING0(32位操作系统)
计算机操作系统处理机调度读后感: 笔者在看操作系统西安电子科技大学那本书的时候,初次感觉本科教的不会太难,所以没有认真的看,但是随后这本书讲的刷新了我的世界观.这本书居然是ring0级别的,这时不禁吐 ...
- go语言学习之路三:切片
前面讲了变量的有关知识,这里对于其他的数据类型就不多作介绍,(和C差不多),因此重点来讨论下切片. 一.切片是引用类型,这里要稍微介绍两个概念:值类型,构造类型和引用类型 1.值类型:是一种由类型的实 ...
- HTML5 这些你全知道吗?
今天心情烦躁,搭建个论坛各种失败,Laravel.React也学不进去,于是就复习复习学过的.记录一下很少用的东西. 代码摘抄于W3C菜鸟教程HTML5手册 # 定义文本方向 <element ...
- memcache的学习路线图
memcache学习材料 //memcache自带的github 上的 wiki //席剑飞 Memcache(MC)系列 1~8系列 评注: memcache系统写的最深的一博客,建议一读 ...
- IE浏览器打不开解决的方法
windows 7和windows 8上的IE浏览器打不开.非常可能是权限问题,解决的方法: 点击"開始"-"执行",输入"regedit" ...
- NAND FLash基础概念介绍
一.引脚介绍 引脚名称 引脚功能 CLE 命令锁存功能 ALE 地址锁存功能 /CE 芯片使能 /RE 读使能 /WE 写使能 /WP 写保护 R/B 就绪/忙输出信号 Vcc 电源 Vss 地 N. ...
- github 新建远程仓库 及 删除远程仓库
一.新建远程仓库 1.点击 ' + ' 号 2.选择 ' new repository ' 3.填写信息 创建仓库 二.删除远程仓库 1.点击 ' Settings ' 按钮 2.滑动到最底部,点击 ...
- AspNet MVC4 教学-23:Asp.Net MVC4 Display And Editor 模板技术高速应用Demo
A.创建Basic类型的项目. B.在Model文件夹下,创建3个文件: Role.cs: using System; using System.Collections.Generic; using ...