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


使用如下:

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

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 203,324评论 5 476
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 85,303评论 2 381
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 150,192评论 0 337
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,555评论 1 273
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,569评论 5 365
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,566评论 1 281
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 37,927评论 3 395
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,583评论 0 257
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 40,827评论 1 297
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,590评论 2 320
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,669评论 1 329
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,365评论 4 318
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 38,941评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,928评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,159评论 1 259
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 42,880评论 2 349
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,399评论 2 342

推荐阅读更多精彩内容