UiView 和 CALayer 的关系就是 典型的
适配模式
的经典应用
UIView 是 继承UIReponse
, 同时 持有一个CALayer
的属性
1.讨论CALayer 的几个属性
1). CALayer 有个 重要的属性 就是 contents
(就是CGImage
或者 NSImage
,说到底就是一个 位图 bitMap
),其实后面设计到的绘制其实都是和这个属性有关
2). contentsGravity
(UIView 中是contentMode
) : 就是设置 位图的显示状态
3). contentsScale
: 默认是 屏幕的scale,比如 值为2,就是说 我们的屏幕的一个点 绘制 2个像素点。
4).contentsRect
: 这个是单位Rect
, 比如设置(0,0,0.5,0.5) 显示单位位置的 这个区域
5).contentsCenter
: 也是一个'单位rect' ,主要是 设置 哪些区域 不需要被拉伸,比如我们聊天的气泡
2. CALayer 的 绘制
其实就是怎么样去绘制
contents
,那么就需要考虑我们的CALayerDelegate
1).首先 layer 去调用 setNeedDisplay
的时候,在Runloop 的 beforeWaiting
的时机去 调用 -(void)displayLayer:(CALayerCALayer *)layer;
(特别注意这个时候 调用 UIGraphicsGetCurrentContext(),返回的值是nil
).
2).假设没有实现上面那个方法,就会调用 - (void)drawLayer:(CALayer *)layer inContext:(CGContextRef)ctx
这个时候 就获取到了ctx,但是 UIGraphicsGetCurrentContext()
任然为 nil
3).最后 如果 是 UIView
中,而且没有实现上面的代理的方法,那么就会 调用drawRect
方法;
网友评论