版本记录
版本号 | 时间 |
---|---|
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;
后记
本篇已结束,后面很精彩~~~