7

我有的:

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

ViewA -> ViewB -> CAGradientLayer

我在做什么:

在某一时刻,我想为frameViewA 的(仅它的高度)设置动画。所以它会是这样的:

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

问题:

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

我尝试了什么:

我尝试在动画块内执行Apple 建议UIView操作,但实际上并没有起作用,因为我仍在此处为帧设置动画:

viewA.frame = newFrame;

我也明白我应该为边界设置动画,而不是框架CALayer,问题是,我怎样才能为边界设置动画,并且在为 ViewA 的框架设置动画时将其CALayer排除在动画之外?

我想要的是:

我只想为它的高度变化设置动画,所以我会同时看到viewACAGradientLayer动画。

4

2 回答 2

2

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

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

您的代码也缺少详细信息。例如,你声称你看到你的渐变层改变了它的框架,但你没有显示你在哪里改变它。你是否覆盖了layoutSubviews某个地方来更新它frame

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

[CATransaction begin];
[CATransaction setAnimationDuration:10.0];
_myLayer.frame = newFrame;
[CATransaction commit]; 
于 2013-07-30T13:36:34.980 回答
2

首先,阅读这个

尝试将您的视图动画代码与图层动画一起明确封装。不要期望图层会自动设置动画。由于您正在处理定位,因此您需要更改graidentlayer.bounds.

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

[CATransaction begin];    
[CATransaction setDisableActions: NO];    
[CATransaction commit];
于 2013-07-30T17:27:02.447 回答