---页首---

改变图层的默认行为

改变图层的默认行为

CoreAnimation 实现自己的隐式动画是通过图层使用操作对象,操作对象遵循CAAction协议并且定义相关的行为在图层上执行。所有的CAAnimation对象都实现了这个协议,当图层的属性发生改变,这些对象就会被分配执行。你可以定义几乎任意的动画行为,属性只是其中一种操作方式。因此你要定义动作,然后与你的图层对象关联起来。

采用 CAAction 协议自定义操作对象

自定义操作对象要自己的类遵循 CAAction协议且实现 runActionForKey:object:arguments:方法。在这个方法中使用可利用的信息在图层上执行想要的操作,也可以在此方法中为图层添加动画对象或执行其它任务。

  • 自定义一个操作对象,你必须确定如何触发操作。操作触发器定义稍后用于注册该操作的键。由以下任何一种情况触发操作对象
    • 图层的一个属性值变化。这可以是图层的任一属性,不仅仅包括可动画的属性。为图层添加的自定义的属性也可关联操作。区分操作的 key就是属性的名字
    • 图层可见或被添加到图层的层级。区分此操作的keykCAOnOrderIn
    • 从图层层级中移除。区分此操作的keykCAOnOrderOut
    • 图层将涉及一个过渡动画。区分此操作的keykCATransition

操作对象必须在图层上才有效果

动作执行前,图层需要找到相应的操作对象去执行。与图层相关的操作 key是被修改的属性名称或标识操作符的特殊字符串。当某个事件在层上发生时,图层将会调用 actionForKey方法去搜索与这个key关联的操作对象。CoreAnimation查找操作对象顺序如下:

  • 如果图层有代理且代理实现actionForLayer:forKey方法,图层调用此方法,代理必须实现以下一个
    • 返回操作对象给定的 key
    • 如果没有处理此操作,返回 nil,查找继续
    • 返回 NSNull对象 ,搜索立即结束
  • 图层在属性actions字典中查找给定的key
  • 图层在属性style字典中查找(换句话说:style包含一个actions的key,它的值仍然是字典。图层用给定的key在第二个字典中查找)
  • 图层调用 defaultActionForKey:的类方法
  • 图层执行 CoreAnimation 定义的隐式操作(如果有)

建立自己的操作对象将依据你怎样修改图层

// 示例:实现操作对象代理方法,改变图层的 contents 属性,使用过渡动画交换成新的内容
- (id<CAAction>)actionForLayer:(CALayer *)theLayer
                        forKey:(NSString *)theKey {
    CATransition *theAnimation=nil;
    if ([theKey isEqualToString:@"contents"]) {
        theAnimation = [[CATransition alloc] init];
        theAnimation.duration = 1.0;
        theAnimation.timingFunction = [CAMediaTimingFunction functionWithName:kCAMediaTimingFunctionEaseIn];
        theAnimation.type = kCATransitionPush;
        theAnimation.subtype = kCATransitionFromRight;
    }
    return theAnimation;
}

用 CATransaction 类暂时禁用操作

当改变图层属性时,CoreAniamtion 通常会创建一个隐式的事务对变更进行动画。如果不想对改变进行动画,可以通过创建隐匿事务设置属性kCATransactionDisableActions = true禁用隐式动画。

[CATransaction begin];
[CATransaction setValue:(id)kCFBooleanTrue
                 forKey:kCATransactionDisableActions];
[aLayer removeFromSuperlayer];
[CATransaction commit];
posted @ 2020-02-20 15:55  20190311  阅读(230)  评论(0编辑  收藏  举报
---页脚---