CALayer.opacity不在CATransaction内动画

时间:2014-08-15 21:58:20

标签: animation core-animation calayer catransaction

我正在尝试使用CALayer设置CATransaction的不透明度的变化动画,但它不起作用:

[CATransaction begin];
[CATransaction setAnimationDuration:3];
[CATransaction setCompletionBlock:^{
    NSLog(@"ENTERING COMPLETION BLOCK");
}];
NSLog(@"BEGINNING TRANSACTION");
self.opacity = 1;
[CATransaction commit];

此代码中的0不透明度不会生成动画。它会立即更改,尽管事务确实需要3秒才能在完成块显示消息“输入完成块”之前,如预期的那样。我知道这种类型的动画不适用于视图的主层,但这不是这种情况。

如果你想知道,我使用CATransaction而不是CABasicAnimation因为(1)我发现代码更容易阅读(和写),以及(2)它使用完成块使链接更容易(我不是在这里做)。

是否有一些原因我不知道这会使CATransaction成为这类动画的不良候选者?

1 个答案:

答案 0 :(得分:0)

图层- (id<CAAction>)actionForKey:(NSString *)key似乎不再为其动画属性返回默认动画

您可以通过继承CALayer并覆盖该方法来解决此问题。像这样:

- (id<CAAction>)actionForKey:(NSString *)key {
    if ([key isEqualToString:@"opacity"]) {
       return [CABasicAnimation animationWithKeyPath:key]
    }
   return nil
 }

或者,如果您可以使用图层委托方法:- (id<CAAction>)actionForLayer:(CALayer *)layer forKey:(NSString *)key