[英]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
从动画中移出?
我想要的是:
我只想动画它的高度变化,所以我会同时看到viewA
和CAGradientLayer
动画。
您必须了解UIView
和CALayer
层次结构是不同的。 在UIView
上运行的布局更改和动画不会自动影响CALayer
层次结构。
因此,如果您希望应用于视图的更改影响图层,则必须自行更新。
您的代码也缺少详细信息。 例如,您声称您看到渐变图层更改了它的框架,但您没有显示更改它的位置。 你有没有覆盖layoutSubviews
来更新它的frame
?
默认情况下,更新图层frame
将触发它的position
和bounds
属性的隐式动画。 要更改动画的速度,您可以使用:
[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.