typedef NS_OPTIONS (unsigned int, CAEdgeAntialiasingMask)
{
kCALayerLeftEdge = 1U << 0, /* Minimum X edge. */
kCALayerRightEdge = 1U << 1, /* Maximum X edge. */
kCALayerBottomEdge = 1U << 2, /* Minimum Y edge. */
kCALayerTopEdge = 1U << 3, /* Maximum Y edge. */
};
图层树:模型树(我们平时操作)、呈现树、渲染树(个人)
+ (instancetype)layer;
- (instancetype)init;
- (instancetype)initWithLayer:(id)layer;
- (nullable instancetype)presentationLayer;//获取呈现图层
- (instancetype)modelLayer;//获取模型图层
CALayer 直接new的都是模型图层MLayer。如果MLayer.modelLayer,返回就是self。MLayer.presentationLayer返回的呈现图层,无论你调多少次返回的呈现图层的地址都一样,但是不同与模型图层。
动画分为CoreAnimation 与 非CoreAnimation
CoreAnimation,即事务动画。动画执行者是专门负责渲染的渲染进程,操作的是呈现树。CoreAnimation是充分优化过的,能够充分利用GPU提高渲染效率,所以我们应该尽量使用CoreAnimation来控制动画。
非CoreAnimation动画执行者是当前进程,操作的是模型树。常见的有定时器动画和手势动画。非CoreAnimation动画动画过程中实际上不断改动的是模型树,而呈现树仅仅成了模型树的复制品,状态与模型树保持一致。整个过程中,主要是CPU在主线程不断调整图层属性、布局计算、提交数据,没有充分利用到CoreAnimation强大的动画控制功能。
+ (nullable id)defaultValueForKey:(NSString *)key;//用KVC来访问属性 返回CALayer对应属性默认值,如果没有设置默认值,就返回nil。如果访问属性类型不是对象,返回的是NSValue。 个人感觉什么屌用没有
+ (BOOL)needsDisplayForKey:(NSString *)key;//子类重写
对给定属性返回true会使该层的内容在属性发生更改时重新绘制(包括由附加到该层的动画更改)。默认实现返回NO。子类应该调用超类定义的属性。(例如,对于CALayer所实现的属性,不要尝试返回YES,否则将会有未定义的结果。)
使用如下:
myLayer集成CALayer。当属性MyProperty发生变化就重绘。
- (BOOL)shouldArchiveValueForKey:(NSString *)key;//返回NO 指定的属性属性不归档。返回YES 指定的属性能归档。 子类重写
@property CGRect bounds;
@property CGPoint position;
@property CGFloat zPosition;//可以用来改变layer的父视图的显示顺序 值越大显示在越上面 就是z轴的值。
@property CGPoint anchorPoint;
@property CGFloat anchorPointZ;//这个就不知道是干什么的了
@property CATransform3D transform;
- (CGAffineTransform)affineTransform;
- (void)setAffineTransform:(CGAffineTransform)m;
@property CGRect frame;
@property(getter=isHidden) BOOL hidden;
@property(getter=isDoubleSided) BOOL doubleSided;// 是否两面都有,默认yes
@property(getter=isGeometryFlipped) BOOL geometryFlipped;设置为yes,则子图层或者子视图本来相对于左上角放置 改为 相对于左下角放置;
- (BOOL)contentsAreFlipped;//如果层的内容属性的内容在与本地坐标空间的关系中被隐式翻转时(例如,如果有奇数层具有flippedge计量=是的从接收者向上,包括根层的隐式容器),则返回true
@property(nullable, readonly) CALayer *superlayer;//父图层
- (void)removeFromSuperlayer; @property(nullable, copy) NSArray*sublayers;
- (void)addSublayer:(CALayer *)layer;
- (void)insertSublayer:(CALayer *)layer atIndex:(unsigned)idx;
- (void)insertSublayer:(CALayer *)layer below:(nullable CALayer *)sibling;//在sibling 之下 添加layer
- (void)insertSublayer:(CALayer *)layer above:(nullable CALayer *)sibling;// 在sibling 之上 添加layer
- (void)replaceSublayer:(CALayer *)layer with:(CALayer *)layer2;//经过测试layer被layer2给取代。就算layer2、layer都是其的子图层,layer也不是就和layer换一下位置,layer会被移除。看图1,图2。
@property CATransform3D sublayerTransform;
CATransform应用于“sublayers”数组中的每个成员,同时将其内容赋给接收者的输出。通常使用投影矩阵将透视图和其他查看效果添加到模型中。默认identity。可以做成动画
@property(nullable, strong) CALayer *mask;//遮掩图层
@property BOOL masksToBounds;//超出部分不显示
- (CGPoint)convertPoint:(CGPoint)p fromLayer:(nullable CALayer *)l;
- (CGPoint)convertPoint:(CGPoint)p toLayer:(nullable CALayer *)l;
- (CGRect)convertRect:(CGRect)r fromLayer:(nullable CALayer *)l;
- (CGRect)convertRect:(CGRect)r toLayer:(nullable CALayer *)l;
- (CFTimeInterval)convertTime:(CFTimeInterval)t fromLayer:(nullable CALayer *)l;
- (CFTimeInterval)convertTime:(CFTimeInterval)t toLayer:(nullable CALayer *)l; 坐标和时间的转换。
- (nullable CALayer *)hitTest:(CGPoint)p;
- (BOOL)containsPoint:(CGPoint)p;
@property(nullable, strong) id contents;自己赋值默认nil。类型(CGImage NSImage)
@property CGRect contentsRect;(0,0,1,1)比例
@property(copy) NSString *contentsGravity;显示模式
@property CGFloat contentsScale
@property CGRect contentsCenter;//相当于就切片的中心区域。默认(0,0,1,1)全部拉伸
@property NSString *contentsFormat;//对于- drawlayerincontext提供的层内容的期望存储格式的提示。默认为kCAContentsFormatRGBA8Uint。请注意,这并不会直接影响“内容”属性的解释。
@property(copy) NSString *magnificationFilter;//放大过滤器 默认双线过滤
@property(copy) NSString *minificationFilter;//缩小过滤器 默认双线过滤
@property float minificationFilterBias;//当使用三线性过滤时,当决定使用的细节等级时添加的偏置因子。默认值为0。
CA_EXTERN NSString * const kCAFilterNearest//近均值过滤
CA_EXTERN NSString * const kCAFilterLinear//双线过滤
CA_EXTERN NSString * const kCAFilterTrilinear//三线过滤
- (void)display;//调用这个方法,会调用-drawInContext。但是这个方法一般不直接调用
- (void)setNeedsDisplay;//call -display
- (void)setNeedsDisplayInRect:(CGRect)r;//call -display 指定rect
- (BOOL)needsDisplay;//返回是layer否需要重绘
- (void)displayIfNeeded;//如果需要重绘就call -display
@property BOOL needsDisplayOnBoundsChange;//当layer的bounds发生变化的时候是否call -display。默认no
当true时,CGContext对象传递给- drawincontext:方法可以对提交给它的绘图命令进行排队,这样它们就会在稍后执行(即异步地执行drawincontext:方法)。这可能使该层比同步执行时更早地完成它的绘图操作。默认值为NO