CALayer 类详解

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,否则将会有未定义的结果。)


使用如下:

CALayer 类详解_第1张图片

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

你可能感兴趣的:(CALayer 类详解)