1.UIView是iOS界面元素的基础,所有的界面元素都继承它。本身完全是由CoreAnimation
来实现的。真正的绘图部分,是由CALayer
(Core Animation Layer
)的类管理(包含在QuartzCore
中)。UIView本身,更像是一个CALayer
管理器,访问它的跟绘图和坐标有关的属性,例如frame
,bounds
等等, 内部是在访问包含的CALayer
的相关属性。在iOS中CALayer
的设计主要是了为了内容展示和动画操作,CALayer
本身并不包含在UIKit中,它不能响应事件。所以在使用过程中,需要通过手势来控制CAlayer的属性变化(transform
啦等等)时需要用一个view
来接收手势(touch
事件或者GuestureRecognizer
),并在事件响应方法中实现CAlayer
的变化
- UIView有
layer
属性,可以返回它的CALayer
实例,layerClass
方法,返回主layer
使用的类,UIView的子类,可以通过重载这个方法,来让UIView使用不同的CALayer
来显示,例如通过
- (class) layerClass {
return ([CAEAGLLayer class]);
}
使某个UIView的子类使用GL来进行绘制。
- UIView的
CALayer
类似UIView的子View
树形结构,也可以向它的layer
上添加子layer
- UIView的
layer
树形在系统内部,被系统维护着三份copy
- 逻辑树,就是代码里可以操纵的,例如更改layer的属性等等就在这一份。
- 动画树,这是一个中间层,系统正在这一层上更改属性,进行各种渲染操作。
- 显示树,这棵树的内容是当前正被显示在屏幕上的内容。
这三棵树的逻辑结构都是一样的,区别只有各自的属性。
- 动画的运作
UIView 的主layer
以外,对它的subLayer
,也就是子layer
的属性进行更改,系统将自动进行动画生成,动画持续时间有个缺省时间, 大概是0.5秒。在动画时间里,系统自动判定哪些属性更改了,自动对更改的属性进行动画插值,生成中间帧然后连续显示产生动画效果。 - 坐标系系统
CALayer
的坐标系系统和UIView有点不一样,它多了一个叫anchorPoint
属性,它使用CGPoint
结构,但是值域是0~1,也就是按照比例来设 置。这个点是各种图形变换的坐标原点,同时会更改layer的position
的位置,它的缺省值是{0.5, 0.5}
,也就是在layer的中央。
某layer.anchorPoint
=CGPointMake(0.f, 0.f)
;
如果这么设置,layer
的左上角就会被挪到原来的中间的位置,
加上这样一句就好了
某layer.position = CGPointMake(0.f, 0.f)