CALayer.opacity 在 CATransaction 内没有动画

Posted

技术标签:

【中文标题】CALayer.opacity 在 CATransaction 内没有动画【英文标题】:CALayer.opacity not animating inside CATransaction 【发布时间】:2014-08-15 21:58:20 【问题描述】:

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

[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】:

- (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

【讨论】:

以上是关于CALayer.opacity 在 CATransaction 内没有动画的主要内容,如果未能解决你的问题,请参考以下文章

NOIP 2015 & SDOI 2016 Round1 & CTSC 2016 & SDOI2016 Round2游记

秋的潇洒在啥?在啥在啥?

上传的数据在云端的怎么查看,保存在啥位置?

在 React 应用程序中在哪里转换数据 - 在 Express 中还是在前端使用 React?

存储在 plist 中的数据在模拟器中有效,但在设备中无效

如何在保存在 Mongoose (ExpressJS) 之前在模型中格式化数据