为什么view.layer.backgroundColor = randomColor不会为颜色变化设置动画?

时间:2016-01-20 14:47:58

标签: ios animation core-animation calayer

当我尝试设置view.layer.backgroundColor时,颜色会立即更改而不会生成动画。 但是,如果我创建一个CALayer,将其添加为view.layer的子图层,并更改该CALayer的backgroundColor,我可以看到隐式颜色更改动画。 任何人都可以解释为什么在更改view.layer.backgroundColor时没有动画?

\\ add CALayer
self.colorLayer = [CALayer layer];
self.colorLayer.frame = CGRectMake(50.0f, 50.0f, 100.0f, 100.0f);
self.colorLayer.backgroundColor = [UIColor blueColor].CGColor;
[self.view.layer addSublayer:self.colorLayer];

\\change the color somewhere else
CGFloat red = arc4random() / (CGFloat)INT_MAX;
CGFloat green = arc4random() / (CGFloat)INT_MAX;
CGFloat blue = arc4random() / (CGFloat)INT_MAX;
self.colorLayer.backgroundColor = [UIColor colorWithRed:red green:green blue:blue alpha:1.0].CGColor; // can animate
self.view.layer.backgroundColor = [UIColor colorWithRed:red green:green blue:blue alpha:1.0].CGColor; // won't animate

2 个答案:

答案 0 :(得分:4)

来自Core Animation Programming Guide

  

由于iOS视图始终具有底层,因此UIView类本身直接从层对象派生其大部分数据。因此,您对图层所做的更改也会自动反映在视图对象中。此行为意味着您可以使用Core Animation或UIView接口进行更改。

     

如果要使用Core Animation类来启动动画,则必须从基于视图的动画块中发出所有Core Animation调用。 [CategoryId, DefectId, Image-Link]类默认禁用图层动画,但会在动画块内重新启用它们。因此,您在动画块之外所做的任何更改都不会设置动画。

(强调补充。)

答案 1 :(得分:2)

原因是该图层是视图的基础层 。该图层没有隐式图层动画。只有(我们可以称之为)次要层的隐式层动画,即您自己添加的子层。