繁体   English   中英

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

[英]Animate UIView frame with CALayer as subview

我有的:

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

ViewA - > ViewB - > CAGradientLayer

我在做什么:

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

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

问题:

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

我尝试了什么:

我尝试在这里做了苹果推荐的东西 ,在UIView动画块里面做了,但它实际上没有用,因为我仍然在这里动画框架:

viewA.frame = newFrame;

我也明白我应该为边界设置动画,而不是CALayer的框架,问题在于,我如何设置边界的动画,并且当动画ViewA的框架动画时,将CALayer从动画中移出?

我想要的是:

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

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

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

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

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

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

首先,请阅读此内容

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

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

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM