一、CALayer的常用属性
-
1、@propertyCGPoint position;
图层中心点的位置,类似与UIView的center;用来设置CALayer在父层中的位置;以父层的左上角为原点(0,0); -
2、 @property CGPoint anchorPoint;
称『定位点』、『锚点』,该描述是相对于x、y位置比例而言的默认在图像中心点(0.5、0.5)的位置;决定着CALayer身上的哪个点会再position属性所指的位置,以自己的左上角为原点(0,0);它的x、y取值范围都是0~1。 -
3、 @property(nullable) CGColorRef backgroundColor;
图层背景颜色 -
4、 @property(nullable) CGColorRef borderColor;
图层边框颜色 -
5、 @property CGFloat borderWidth;
图层边框宽度 -
6、 @property CGRect bounds;
图层大小 -
7、 @property(nullable, strong) id contents;
图层显示内容,例如可以将图片作为图层内容显示 -
8、 @property CGRect contentsRect;
图层显示内容的大小和位置 -
9、 @property CGFloat cornerRadius;
圆角半径 -
10、 @property(getter=isDoubleSided) BOOL doubleSided;
图层背景是否显示,默认是YES -
11、 @property CGRect frame;
图层大小和位置,不支持隐式动画,所以CALyaer中很少使用frame,通常使用bound和position代替 -
12、 @property(getter=isHidden) BOOL hidden;
是否隐藏 -
13、 @property(nullable, strong) CALayer *mask;
图层蒙版 -
14、 @property BOOL masksToBounds;
子图层是否剪切图层边界,默认是NO -
15、 @property float opacity;
图层透明度,类似与UIView的alpha -
16、 @property(nullable) CGColorRef shadowColor;
阴影颜色 -
17、 @property CGSize shadowOffset;
阴影偏移量 -
18、 @property float shadowOpacity;
阴影透明度,注意默认为0,如果设置阴影必须设置此属性 -
19、 @property(nullable) CGPathRef shadowPath;
阴影形状 -
20、 @property CGFloat shadowRadius;
阴影模糊半径 -
21、 @property(nullable, copy) NSArray
二、CALayer不常用属性
-
1、 @property CGFloat zPosition;
图层中心点在z轴中的位置 -
2、 @property CGFloat anchorPointZ;
图层在z轴中的锚点; -
3、 - (CGAffineTransform)affineTransform;
-
4、- (void)setAffineTransform:(CGAffineTransform)m;
以上属性为图层形变;该属性值指定一个CGAffineTransform对象,该对象代表对CALayer执行X、Y两个维度(也就是平面)上的旋转、缩放、位移、斜切、镜像等变换矩阵 -
5、 @property(nullable, readonly) CALayer *superlayer;
图层的父图层
三、CALayer图层操作
-
1、 - (void)addSublayer:(CALayer *)layer;
添加子图层 -
2、 - (void)removeFromSuperlayer;
将自己从父图层中移除 -
3、 - (void)insertSublayer:(CALayer *)layer atIndex:(unsigned)idx;
在自己子图层数组中的第idx位置添加图层 -
4、 - (void)insertSublayer:(CALayer )layer below:(nullable CALayer )sibling;
将图层layer添加在子图层sibling的下面 -
5、 - (void)insertSublayer:(CALayer )layer above:(nullable CALayer )sibling;
将图层layer添加在子图层sibling的上面 -
6、 - (void)replaceSublayer:(CALayer )layer with:(CALayer )layer2;
将图层layer替换layer2;
四、CALayer动画操作
-
1、 - (void)addAnimation:(CAAnimation )anim forKey:(nullable NSString )key;
图层添加某一属性的动画 -
2、 - (nullable NSArray< NSString > )animationKeys;
获取所有动画的属性 -
3、 - (nullable CAAnimation )animationForKey:(NSString )key;
获取某一属性的动画 -
4、 - (void)removeAnimationForKey:(NSString *)key;
移除某一属性动画 -
5、 - (void)removeAllAnimations;
移除所有动画
五、隐式动画
在ios中CALayer的设计主要是为了内容展示和动画操作,CALayer本身并不包含在UIKit中,它不能响应事件。由于CALayer在设计之初就考虑它的动画操作功能,CALayer很多属性在修改时都能形成动画效果,这种属性称为『隐式动画属性』。但是对于UIView的根视图层而言属性的修改并不形成动画效果,因为很多情况下根图层更多的充当容器的作用,如果它的属性变动形成动画效果会直接影响子图层。另外,UIView的根图层创建工作完全有iOS负责完成,无法重新创建,但是可以往根图层中添加子图层或移除子图层。
-
1、如何查看CALayer的某个属性是否支持隐式动画
- 可以查看头文件,看有没有Animatable,如果有表示支持;
- 查看官方文档
- 下面标明都支持隐式动画
- 可以查看头文件,看有没有Animatable,如果有表示支持;
-
2、例子
七、CALayer绘图
使用Quartz 2D绘图,是直接调用UIView的drawRect:方法绘制图形、图像,这种方式的本质还是再图层中绘制。drawRect:方法是由UIKit组件进行调用,因此厘米那可以使用到一些UIKir封装的方法进行绘制,而直接绘制到图层的方法由于并非UIKit直接调用因此只能用原生的Core Graphics方法绘制;
图层绘制有两种方法,不管使用那种方法绘制完必须调用图层的setNeedDisplay方法,下面介绍图层的两种绘制方法:
(1)、通过图层代理drawLayer:inContext:方法绘制
通过代理方法进行图层呢个绘制只要指定图层的代理,然后在代理对象中重写 - (void)drawLayer:(CALayer *)layer inContext:(CGContextRef)ctx;方法即可。需要注意这个方法虽然是代理方法但是不用手动实习那CALayerDelegate,因为CALayer定义中给NSObject做了分类扩展,所有的NSObject都包含这个方法。另外设置完代理后必须要调用图层的 - (void)setNeedsDisplay;方法,否测绘制内容无法显示;
例如:
(2)、使用自定义图层绘图
在自定义图层绘图时只要自己编写一个类继承与CALayer然后在 - (void)drawInContext:(CGContextRef)ctx;中绘图即可。同前面在代理方法绘图一样,要显示图层中绘制的内容也要调用图层的 - (void)setNeedsDisplay;方法,否则 - (void)drawInContext:(CGContextRef)ctx;方法将不会调用;
例如: