备注:
frame代表了图层的外部坐标(也就是父图层上占据的空间[指一个和屏幕平行的矩形能完全覆盖图层,比如说图层旋转了,那么他的frame就变大了]),bounds是内部坐标。
图层旋转按照锚点anchorPoint来旋转。
一般我们都知道子图层相对于父图层的位置坐标,但是有时候我们需要知道该子图层相对于其它图层的坐标,CALayer提供了convertPoint系列转换计算position方法。
zPosition最实用的功能就是改变图层的显示顺序。
CALayer不关心任何响应链事件,所以不能直接处理触摸事件或者手势。但是他有一系列的方法帮你处理事件:-containsPoint:和-hitTest:
-containsPoint:的用法,先获取相对于self.view的point,然后利用convertPoint系列方法将点转换为相对于目标layer的坐标,然后用目标layer调用containsPoint方法,看目标layer是否包含了point。包含了就返回YES。
-hitTest:的用法,该方法返回一个layer。返回最外层检测到点击点的layer,不需要利用convertPoint方法进行转换。注意:zPosition可以改变图层的显示顺序,但是不改变事件的传递顺序。
该文涉及了CALayer的集合结构,包括它的frame、position和bounds,介绍了三维空间内图层的概念,以及如何在独立的图层内响应事件,最后简单说明了在iOS平台,Core Animation对自动调整和自动布局支持的缺乏。
备注:
当你需要给一个view添加shadow的时候,如果对应的layer的masksToBounds设置为了YES,就会将边框外的全部裁剪掉,也就是会把shadow裁剪掉。这时候你就需要用一个透明的蒙板罩在view上面,设置蒙板的shadow就好了。
设置shadow,主要设置shadowOpacity不透明度。其次设置shadowColor、shadowOffset和shadowRadius。
图层的shadow并不总是方的,而是从图层的形状继承而来。但是实时计算shadow是非常消耗资源的,尤其是在图层有多个子图层,每个图层还有一个透明效果的寄宿图的时候。如果你知道阴影的形状,那么就可以设置shadowPath这个属性来进行处理了。如果是一个简单的矩形或者是圆啥的,用CGPath很好的到这些path,如果是比较复杂的,那就用UIBezierPath来获取path。
图层蒙板:图层有一个mask属性(CALayer类型),相当于在父图层上将这个layer盖上去,盖到的地方就是你获取到的显示图层。
minificationFilter和magnificationFilter属性可以用来设置图层上图片的清晰度。
该文介绍了一些可以通过代码应用到图层上的视觉效果,如圆角,阴影和蒙板。我们也了解了拉伸过滤器和组透明。
备注:
UIView的transform属性对应着CALayer 的affineTransform属性,都是仿射变换,所谓仿射变换就是保证变换后对应该平行的都是平行的。我们一般用的就是仿射变换。而CALayer也有一个transform属性(CATransform3D类型)。
混合变换就是利用比如CGAffineTransformScale();之类的方法来进行变换,第一个参数t会影响下次变换的值。eg:
第一个是缩小到0.5倍,第二个是旋转30度,第三个是平移200,但是你会发现最后一个并不是水平移动200,而是朝着30度方向平移了100.这就是前面的缩放影响了距离,旋转影响了角度。
CGAffineTransform transform = CGAffineTransformIdentity; //scale by 50%
transform = CGAffineTransformScale(transform, 0.5, 0.5); //rotate by 30 degrees
transform = CGAffineTransformRotate(transform, M_PI / 180.0 * 30.0); //translate by 200 points
transform = CGAffineTransformTranslate(transform, 200, 0);
//apply transform to layer
self.layerView.layer.affineTransform = transform;
}
除了平时经常用的平移、旋转、缩放还有一种不常用的叫剪切变换也就是倾斜。这个要自己实现。 里面有例子。
灭点:Core Animation定义了这个点位于变换图层的anchorPoint。意思就是当图层发生变换的时候,这个点永远位于图层变换之前的anchorPoint的位置。当改变一个图层的position的时候,同时也改变了它的灭点,做3D变换的时候要记住这一点,当你试图通过调整面m34来让它更具有3D效果时,应该首先把它放置在屏幕中央,然后通过平移来把它移动到指定的位置。但是何必这么麻烦,设置容器layer的sublayerTransform的m34为-1/500就好了。其它的子layer该怎么就怎么。
CALayeryou一个属性doubleSides来控制图层的背面是否需要绘制。有些没必要绘制的地方一定要设置它为NO,这样会减少资源浪费。
备注:
CAShapeLayer是用来在CALayer上画图的工具类。画完之后,将CAShapeLayer对象添加到CALayer对象上去。
该文在圆角部分告诉了我们怎么给一个矩形自定义的添加圆角,而不是调用cornerRadius来将所有的直角变成圆角。
CATextLayer类比于UILabel。性能比UILable好。