我有什么:
我有一个UIView's
和CAGradientLayer
的层次结构,用于设置此层次结构的“背景颜色”。所以我有这样的事情:
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}动画出来了吗?
我想要的是什么:
我只想为其高度的变化设置动画,因此我会同时看到CALayer
和viewA
动画。
答案 0 :(得分:2)
您必须了解UIView
和CALayer
层次结构是不同的。在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];