使用CALayer作为子视图动画UIView框架

时间:2013-07-30 12:05:13

标签: iphone ios uiview core-animation calayer

我有什么:

我有一个UIView'sCAGradientLayer的层次结构,用于设置此层次结构的“背景颜色”。所以我有这样的事情:

ViewA - > ViewB - > CAGradientLayer

我在做什么:

有一次,我想要为ViewA的frame(仅高度)设置动画。所以它会是这样的:

[UIView animateWithDuration:timeInterval
                      delay:0
                    options:UIViewAnimationOptionCurveEaseIn
                 animations:^{
                              viewA.frame = newFrame;
}];

问题:

这个问题是CAGradientLayer不会为它的框架设置动画,它只是改变它的框架,然后viewA开始按预期动画(通过将模拟器设置为慢动作动画可以清楚地看到这一点) )。

我尝试了什么:

我试图通过在UIView动画块中执行它来做Apple推荐的here,但它实际上没有用,因为我仍然在这里设置框架动画:

viewA.frame = newFrame;

我也理解我应该为边界设置动画,而不是CALayer的框架,问题在于,我如何设置边界的动画,并且在为ViewA的框架设置动画时留下{{1}动画出来了吗?

我想要的是什么:

我只想为其高度的变化设置动画,因此我会同时看到CALayerviewA动画。

2 个答案:

答案 0 :(得分:2)

您必须了解UIViewCALayer层次结构是不同的。在UIView上运行的布局更改和动画不会自动影响CALayer层次结构。

因此,如果您希望应用于视图的更改会影响图层,则必须自行更新。

您的代码也缺少详细信息。例如,您声称您看到渐变图层更改了它的框架,但您没有显示更改它的位置。您是否在某处覆盖layoutSubviews以更新frame

默认情况下,更新图层frame会触发position&的隐式动画。 bounds属性。要更改动画的速度,您可以使用:

[CATransaction begin];
[CATransaction setAnimationDuration:10.0];
_myLayer.frame = newFrame;
[CATransaction commit]; 

答案 1 :(得分:2)

首先,请阅读this

尝试显式封装视图动画代码和图层动画。不要指望图层自动动画。由于您正在处理定位,因此您需要更改graidentlayer.bounds

如果这不起作用,请在动画代码之前尝试:

[CATransaction begin];    
[CATransaction setDisableActions: NO];    
[CATransaction commit];