参看iOS-Core-Animation-Advanced-Techniques(一)
参看CALayer与UIView的关系
参看iOS CoreAnimation专题——原理篇(一) CALayer与UIView之间的关系
UIView是iOS开发的核心类,在我们看来,它负责几乎所有的界面展示和用户交互,这是苹果设计得非常好的一个地方——它完美的将其真正负责绘制界面的那个类封装起来了,对开发者而言,我们几乎只和UIView打交道就能完全控制一个视图的显示而不需要去管它底层究竟如何去处理的,然而我们今天必须要稍微深入进UIView中看看,以便于我们之后对动画原理的学习。
对于CALayer这个类 我相信大家都不太陌生,大多数人第一次接触这个类都是通过一个UIView对象的属性layer认识的。在学习如何给一个视图加圆角、设置边框颜色之类的效果的时候,第一次接触到了CALayer,当时并没有去理会这个东西,因为它似乎并不是UIKit框架中的东西,也不知道它有啥用,只是隐隐觉得这个家伙并不简单,事实的确如此。
CALayer是属于QuartzCore框架,而这个框架是一个跨平台的绘制框架。这里的跨平台指的是在iOS和OS X系统上均能使用,也就是说CALayer能在iOS和OS X上面绘制内容 (这也说明了为什么CALayer的很多属性都不是UIKit框架下面的东西,比如它的backgroundColor是CGColorRef,因为OS X中没有UIKit)。但是这两个平台接收用户交互的方式完全不一样:iOS是通过触摸事件(touch event)而OS X则是监听鼠标和键盘事件。
苹果的工程师们考虑到:这两个平台的绘制规则(如何将一个像素显示到屏幕上)都是一样的,但是交互规则完全不一样。所以他们使用了同一种绘制方式和不同的交互方式,具体的,他们将CALayer作为两个平台共同的用来绘制内容的类而针对交互方式,他们在iOS中使用了UIResponder类来响应交互,在OS X中则没有UIKit里面的类取而代之是叫做NSView之类的东西。而通常情况下交互是发生在绘制内容之上的(有内容的地方才能点击),所以UIKit将CALayer封装进了UIView中,让开发者们感觉到UIView既能绘制又能处理交互,而实际上负责绘制的是UIView中的CALayer。