CALayer并不清楚具体的响应链,并不可以响应事件,即时提供了一些方法来判断是否一个触点在图层的范围以内。app
1、寄宿图函数
CALayer类能够包含一张图片,即寄宿图(图层中包含的图)。布局
(1)contents属性orm
此属性类型被定义为id,原则上给它赋值任何值,app仍能编译成功,但事实是若是给contents赋的不是CGImage,那么获得的图层将会是空白的。之因此这个属性被定义为id类型,是由于在Mac OS系统上,这个属性对CGImage和NSImage类型的值都起做用。事件
给图层的寄宿图赋值时,须要经过bridge关键字转换,例如:图片
layer.contents = (__bridge id _Nullable)([UIImage imageNamed:@"1.jpg"].CGImage);ip
用此属性赋值图片,图片可能显示得不是很正常,好比拉伸,好像被压缩的样子;如果用UIImageView赋值的话,解决此问题就是设置contentMode属性;it
在CALayer中与contentMode对应的属性叫作contentsGravity,是个NSString类型,可选的常量值有:io
kCAGravityCenter
kCAGravityTop
kCAGravityBottom
kCAGravityLeft
kCAGravityRight
kCAGravityTopLeft
kCAGravityTopRight
kCAGravityBottomLeft
kCAGravityBottomRight
kCAGravityResize编译
kCAGravityResizeAspect
kCAGravityResizeAspectFill
(2)contentScale
定义了寄宿图额像素尺寸和视图比例大小,默认状况下是一个值为1.0的浮点数。可是此属性并非总会对屏幕上的寄宿图有影响;这是由于contents因为设置了contentsGravity属性,
若是只是想单纯的放大图层的contents图片,可使用图层的transform和affineTransform属性来达到效果。
若是contentsScale设置为1.0,将会以每一个点1个像素绘制图片,若是设置为2.0,则会以每一个点2个像素绘制图片,这就是咱们熟知的Retina屏幕。
(3)maskToBounds
在有些状况下,图片会超出控件的边界,在UIView有一个clipsToBounds的属性能够用来决定是否显示超出边界内容,CALayer对应的属性为maskToBounds
(4)contentsRect
此属性能够在图层边框里显示寄宿图的一个子域,比contentsGravity灵活得多;contentsRect使用的是单位坐标,其值为0到1。
(5)contentsCenter
此属性为CGRect类型,它定义了一个固定的边框和一个在图层上可拉伸的区域。 改变contentsCenter的值并不会影响到寄宿图的显示,除非这个图层的大小改变了。
默认状况下,contentsCenter是{0, 0, 1, 1}。
设置此属性显示的效果和UIImage里的-resizableImageWithCapInsets: 方法效果很是相似。
2、布局
CALayer中的布局属性有frame、bounds、position;center和position都表明了相对于父图层anchorPoint(锚点)所在的位置。
(1)锚点
图层的anchorPoint经过position来控制它的frame的位置;默认坐标是{0.5, 0.5}.
(2)Hit Testing
CALayer虽然不能响应事件,可是拥有一些方法能够处理事件:
-containsPoint:若是这个点在图层frame范围内就返回YES
-hitTest:此方法接收一个CGPoint类型参数,返回的是图层自己,或者包含这个坐标点的叶子节点图层,注意当调用图层的-hitTest:方法时,测算的顺序严格依赖于图层树当中的图层顺序(和UIView处理事件相似)。
(3)自动布局
如果想要控制CALayer的布局,最简单的方法就是用CALayerDelegate以下函数:
- (void)layoutSublayersOfLayer:(CALayer *)layer;
当图层的bounds发生改变,或者图层的-setNeedsLayout方法被调用的时候,这个函数将会被执行。
参考自iOS Core Animation;