容易忽略的那些小点总结 (九) —— CALayer相关(八)

版本记录

版本号 时间
V1.0 2018.01.23

前言

在苹果的API文档中,有很多属性和方法我们用的不是很多,所以很容易忽略和出错,下面我就用这一个专题专门说一些不常用的API接口,下面开始。感兴趣的可以参考前面几篇文章。
1. 容易忽略的那些小点总结 (一) —— UIView UIViewTintAdjustmentMode相关(一)
2. 容易忽略的那些小点总结 (二) —— CALayer相关(一)
3. 容易忽略的那些小点总结 (三) —— CALayer相关(二)
4. 容易忽略的那些小点总结 (四) —— CALayer相关(三)
5. 容易忽略的那些小点总结 (五) —— CALayer相关(四)
6. 容易忽略的那些小点总结 (六) —— CALayer相关(五)
7. 容易忽略的那些小点总结 (七) —— CALayer相关(六)
8. 容易忽略的那些小点总结 (八) —— CALayer相关(七)

- (nullable id<CAAction>)actionForKey:(NSString *)event;

返回给定key的action对象,该对象必须实现CAAction代理。

/* Returns the action object associated with the event named by the
 * string 'event'. The default implementation searches for an action
 * object in the following places:
 *
 * 1. if defined, call the delegate method -actionForLayer:forKey:
 * 2. look in the layer's `actions' dictionary
 * 3. look in any `actions' dictionaries in the `style' hierarchy
 * 4. call +defaultActionForKey: on the layer's class
 *
 * If any of these steps results in a non-nil action object, the
 * following steps are ignored. If the final result is an instance of
 * NSNull, it is converted to `nil'. */

返回与由“event”命名的event关联的action对象。 默认实现在以下位置搜索action对象:
1. 如果定义了,就调用代理方法-actionForLayer:forKey:
2. 在layer的actions字典中查找
3. 在style层级的任何actions字典中查找
4. 在layer类中调用+defaultActionForKey:方法

上面这些步骤中,如果哪一步返回一个非nil的action对象,那么该步下面的就会忽略不再
执行查找,如果最后都执行完返回的还是NSNull,那么就是返回nil对象了。

- (nullable id<CAAction>)actionForKey:(NSString *)event;

还要注意以下几点:

  • 此方法搜索图层的给定操作对象。 动作定义了图层的动态行为。 例如,图层的动画属性通常具有相应的动作对象来启动实际的动画。 当该属性更改时,该层将查找与该属性名称关联的操作对象并执行该对象。 您还可以将自定义操作对象与您的图层相关联,以实现应用程序特定的操作。

  • 该方法按以下顺序搜索图层的关联操作:

    • 如果该图层有一个代理并实现了actionForLayer:forKey:方法,图层调用这个方法,代理必须做下面其中的一件事。1)返回给定key对应的action对象 2)如果它没哟㔘action就返回NSNull对象。
    • 图层在图层的动作字典中查找匹配的键/动作对
    • 该图层在style字典中查找匹配键/动作对的动作字典。
    • 该层调用defaultActionForKey:类方法来查找任何类定义的操作
  • 当一个动作对象被调用时,它接收三个参数:事件名称,事件发生的对象(图层),以及每个事件类型特定的命名参数字典


actions

一个包含layer actions的字典,此属性的默认值为零。 您可以使用此字典来存储图层的自定义操作。 该字典的内容作为actionForKey:方法的标准实现的一部分进行搜索。

/* A dictionary mapping keys to objects implementing the CAAction
 * protocol. Default value is nil. */

一个映射key和实现CAAction协议对象的字典,默认值是nil

@property(nullable, copy) NSDictionary<NSString *, id<CAAction>> *actions;

- (void)addAnimation:(CAAnimation *)anim forKey:(nullable NSString *)key;

/* Attach an animation object to the layer. Typically this is implicitly
 * invoked through an action that is an CAAnimation object.
 *
 * 'key' may be any string such that only one animation per unique key
 * is added per layer. The special key 'transition' is automatically
 * used for transition animations. The nil pointer is also a valid key.
 *
 * If the `duration' property of the animation is zero or negative it
 * is given the default duration, either the value of the
 * `animationDuration' transaction property or .25 seconds otherwise.
 *
 * The animation is copied before being added to the layer, so any
 * subsequent modifications to `anim' will have no affect unless it is
 * added to another layer. */

将一个动画对象附加到图层。 通常,这是通过作为CAAnimation对象的操作隐式调用的。

'key'可以是任何字符串,这样具有唯一key的动画被添加到一个图层。 转换动画自动使用特殊键“transition”。 nil指针也是一个有效的key。

如果动画的`duration'属性为零或负值,则给定默认持续时间,可以为'animationDuration'事务属性的值,或者为0.25秒。

动画在被添加到图层之前被复制,所以后续对“anim”的修改将不会有任何影响,除非被添加到另一个图层。

- (void)addAnimation:(CAAnimation *)anim forKey:(nullable NSString *)key;

还要注意下面几点

  • anim参数为要添加到渲染树的动画。 该对象由渲染树复制,未引用。 因此,对对象的后续修改不会传播到渲染树中。
  • key参数为一个标识动画的字符串。 每个唯一键只有一个动画被添加到图层。 特殊键kCATransition
    自动用于转换动画。 你可以指定这个参数为nil。
  • 如果动画的持续时间属性为零或负数,则持续时间将更改为kCATransactionAnimationDuration事务属性(如果已设置)的当前值或默认值0.25秒。
  • 这里介绍个简单的动画实现吧
/**
 *  旋转动画
 */
- (void)rotateAnimation
{
    CABasicAnimation *anima = [CABasicAnimation animationWithKeyPath:@"transform.rotation.z"];//绕着z轴为矢量,进行旋转(@"transform.rotation.z"==@@"transform.rotation")
    anima.toValue = [NSNumber numberWithFloat:3*M_PI];
    anima.duration = 1.0f;
    [_demoView.layer addAnimation:anima forKey:@"rotateAnimation"];
}
  • 有了这个key我们就可以做很多单独的操作,比如说移除这个key对应的动画- (void)removeAnimationForKey:(NSString *)key;,这个方法还是很简单的就不多说了。

style

/* When non-nil, a dictionary dereferenced to find property values that
 * aren't explicitly defined by the layer. (This dictionary may in turn
 * have a `style' property, forming a hierarchy of default values.)
 * If the style dictionary doesn't define a value for an attribute, the
 * +defaultValueForKey: method is called. Defaults to nil.
 *
 * Note that if the dictionary or any of its ancestors are modified,
 * the values of the layer's properties are undefined until the `style'
 * property is reset. */

当非nil时,字典解引用来查找图层没有明确定义的属性值。 (这个字典反过来可以有`style'属性,
形成默认值的层次结构。),如果style字典没有为属性定义值,则调用+ defaultValueForKey:方法。 默认为nil。 

请注意,如果字典或其父类的任何一个被修改,层的属性的值是不确定的,直到'style'属性被重置。

@property(nullable, copy) NSDictionary *style;

- (void)runActionForKey:(NSString *)event object:(id)anObject arguments:(nullable NSDictionary *)dict;

这个是CAAction的代理方法,被调用来触发由标识符指定的Action。

@protocol CAAction

/* Called to trigger the event named 'path' on the receiver. The object
 * (e.g. the layer) on which the event happened is 'anObject'. The
 * arguments dictionary may be nil, if non-nil it carries parameters
 * associated with the event. */

- (void)runActionForKey:(NSString *)event object:(id)anObject
    arguments:(nullable NSDictionary *)dict;

@end

还要注意以下几点:

  • event:Action的标识符。 标识符可以是相对于anObject的键或键路径,任意的外部Action或CALayer中定义的动作标识符之一。
  • anObject:action应该发生的图层
  • dict:包含与event相关的参数的字典,可以为nil。
  • CAAction协议定义了行为对象如何被调用,当行为对象收到一个runActionForKey:object:arguments:的消息时,行为标识符、行为发生所在的图层、额外的参数字典会被作为参数传递给方法。通常行为对象是CAAnimation的子类实例,它实现了CAAction协议。然而你也可以返回任何实现了CAAction协议的类对象。当实例收到runActionForKey:object:arguments:的消息时,它需要执行相应的行为。当CAAnimation实例收到消息runActionForKey:object:arguments:的时候,它把自己添加到图层的动力里面,触发动画的执行。
- (void)runActionForKey:(NSString *)key
                 object:(id)anObject
              arguments:(NSDictionary *)dict
{
     [(CALayer *)anObject addAnimation:self forKey:key];
}

- (nullable id<CAAction>)actionForLayer:(CALayer *)layer forKey:(NSString *)event;

返回actionForKey:方法的默认action。

/* If defined, called by the default implementation of the
 * -actionForKey: method. Should return an object implementating the
 * CAAction protocol. May return 'nil' if the delegate doesn't specify
 * a behavior for the current event. Returning the null object (i.e.
 * '[NSNull null]') explicitly forces no further search. (I.e. the
 * +defaultActionForKey: method will not be called.) */

如果已定义,则由-actionForKey:方法的默认实现调用。 应该返回一个实现CAAction协议的对象。 如果委托没有为当前事件指定行为,可能会返回nil。 返回空对象(即[NSNull null])显式强制不再进行搜索。 (即不会调用+ defaultActionForKey:方法。)

- (nullable id<CAAction>)actionForLayer:(CALayer *)layer forKey:(NSString *)event;

还要注意下面几点:

  • 先看一下返回值:实现CAAction协议的对象,如果代理没有为指定的键指定行为,则为nil。
  • 实现此方法的图层的委托为指定的键返回一个动作,并停止任何进一步的搜索(即,不会返回图层actions字典中的相同键或由defaultActionForKey指定的动作)。

- (void)layerWillDraw:(CALayer *)layer

通知代理立即进行绘制,先看一下API文档。

/* If defined, called by the default implementation of the -display method.
 * Allows the delegate to configure any layer state affecting contents prior
 * to -drawLayer:InContext: such as `contentsFormat' and `opaque'. It will not
 * be called if the delegate implements -displayLayer. */

如果已定义,则由默认实现的-display方法调用。 允许委托在-drawLayer:InContext之前配置影响
内容的任何图层状态,:如“contentsFormat”和“opaque”。 如果代理实现-displayLayer,则不会调用它。

- (void)layerWillDraw:(CALayer *)layer
  CA_AVAILABLE_STARTING (10.12, 10.0, 10.0, 3.0);

重要:如果代理实现displayLayer:,就不会调用本方法、


- (void)layoutSublayersOfLayer:(CALayer *)layer;

/* Called by the default -layoutSublayers implementation before the layout
 * manager is checked. Note that if the delegate method is invoked, the
 * layout manager will be ignored. */

在检查布局管理器之前,由默认的-layoutSublayers实现调用。 请注意,如果调用委托方法,
布局管理器将被忽略。

- (void)layoutSublayersOfLayer:(CALayer *)layer;

后记

本篇已结束,后面很精彩~~~

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

推荐阅读更多精彩内容