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

8

我的情况:

我有一个UIView的层级结构和一个CAGradientLayer,我用它来设置这个层级结构的"背景颜色"。因此,我有以下内容:

ViewA -> ViewB -> CAGradientLayer

我的做法:

在某一时刻,我想要动画化ViewA的frame(仅高度)。因此,代码如下:

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

问题在于CAGradientLayer不会对其帧进行动画处理,它只是更改了其框架,然后视图A开始按预期进行动画处理(这可以通过将模拟器设置为慢速动画来清楚地看到)。

我的尝试:

我尝试执行苹果公司在这里推荐的操作,在UIView动画块内部执行操作,但实际上并没有起作用,因为我仍在此处执行框架动画处理:

viewA.frame = newFrame;

我知道我应该对CALayer的bounds进行动画处理,而不是frame。问题在于,当我对ViewA的frame进行动画处理时,如何将CALayer排除在动画之外?
我只想对其高度进行动画处理,这样我就可以同时看到viewA和CAGradientLayer进行动画处理了。

你能否将一个带有渐变UIImage的UIImageView设置为ViewB的子视图,而不是使用CAGradientLayer?这样它应该会同时调整大小。希望这能有所帮助,但这只是一个想法,因为我不知道在调整大小时CAGradientLayer的行为。 - Javito_009
2个回答

2
您需要理解UIViewCALayer层次结构是不同的。对UIView进行的布局更改和动画不会自动影响CALayer层次结构。
因此,如果您希望应用于视图的更改影响图层,则必须自己更新它。
您的代码还缺少细节。例如,您声称看到渐变层更改了其框架,但未显示在何处更改它。您是否覆盖了layoutSubviews以更新其frame
默认情况下,更新图层的frame将触发其隐式动画的positionbounds属性。要更改动画速度,可以使用:
[CATransaction begin];
[CATransaction setAnimationDuration:10.0];
_myLayer.frame = newFrame;
[CATransaction commit]; 

实际上并没有对 CALayer 做任何操作。它基本上是 ViewB 的图层的子图层。 - Rui Peres
那么,viewB如何设置才能与viewA相对调整大小?即使viewB调整大小,渐变层也不应自动调整大小。 - Joris Kluivers
我并没有对CALayer做任何操作,是的,viewB是自动调整大小的。 - Rui Peres
即使viewB具有自动调整大小功能,渐变层也不应该相对于viewB进行动画。如果它已经在进行动画,则可能发生了其他情况,但这些情况在您发布的代码中缺失。如果您希望渐变层的框架与viewB的边界匹配,则必须通过在viewB的layoutSubviews中调整其框架来手动完成。 - Joris Kluivers
仔细阅读我的问题:问题在于CAGradientLayer无法进行动画处理,该层不会进行动画处理,只是自动更改其框架而已。ViewA是正在进行动画处理的那个视图... - Rui Peres
这就是为什么我认为可能发生了其他未在您发布的代码中列出的事情。因为更改viewA的框架(从而通过自动调整大小更改viewB)甚至不应触发图层框架的更改(视图/图层分离)。这也意味着[UIView animateWithDuration:.....]基本上不应对图层属性更改产生任何动画效果。 - Joris Kluivers

2
首先,阅读这篇文章
尝试显式地封装您的视图动画代码和图层动画代码。不要期望图层会自动进行动画处理。由于您正在处理定位,您需要更改graidentlayer.bounds
如果这不起作用,请在动画代码之前尝试以下操作:
[CATransaction begin];    
[CATransaction setDisableActions: NO];    
[CATransaction commit];

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接