UIView与CALayer的关系

  • 关系
    UIView表示屏幕上的一块矩形区域,IOS中几乎所有可视化控件都是UIView的子类。负责渲染区域的内容,并且响应该区域内发生的触摸事件


    UIView与CALayer的关系_第1张图片
    因为UIView继承于UIResponder,所以UIView是可交互的

而它的绘图部分是由CALayer完成的,UIView包含一个layer属性,所有通过UIView访问的绘图属性,比如frame,本质上都是对其layer属性的访问。

  • 锚点
    CALayer比UIView的坐标系统多了一个anchorPoint属性,即锚点。顾名思义,比如说Layer是一艘船,那么当这艘船下锚之后,不论这艘船怎么转,都要绕着这个锚点。锚点是CGPoint结构,取值范围在0-1之间,默认(0.5,0.5),即layer的中心点,所以锚点是个比例值。iOS中的翻页,转动都是基于锚点来实现的。

  • CGImageRef,CGColorRef/UIImage,UIColor

  • CALayer是定义在QuartzCore框架中的;CGImageRef、CGColorRef两种数据类型是定义在CoreGraphics框架中的;UIColor、UIImage是定义在UIKit框架中的

  • 其次,QuartzCore框架和CoreGraphics框架是可以跨平台使用的,在iOS和Mac OS X上都能使用,但是UIKit只能在iOS中使用

  • 因此,为了保证可移植性, QuartzCore不能使用UIImage、UIColor,只能使用CGImageRef、CGColorRef

  • 不过很多情况下,可以通过UIKit对象的特定方法,得到CoreGraphics对象,比如UIImage的CGImage方法可以返回一个CGImageRef

  • UIView的显示过程

  • 当UIView需要显示时,它内部的层会准备好一个CGContextRef(图形上下文),然后调用delegate(这里就是UIView)的drawLayer:inContext:方法,并且传入已经准备好的CGContextRef对象。而UIView在drawLayer:inContext:方法中又会调用自己的drawRect:方法

  • 平时在drawRect:中通过UIGraphicsGetCurrentContext()获取的就是由层传入的CGContextRef对象,在drawRect:中完成的所有绘图都会填入层的CGContextRef中,然后被拷贝至屏幕

你可能感兴趣的:(UIView与CALayer的关系)