为什么我的CAGradientLayer动画所有的变化



我有一个CAGradientLayer,我想在用户拖动手指时缩放它。然而,当我设置帧的时候,图层会变成新的大小。其他属性也会发生这种情况,包括start/endPoint。

下面是一个例子:

_gradient.frame = CGRectMake(0, 480-toHeight, 320, toHeight);

然而,如果我只在用户拖动了10个像素左右的时候调用这个函数,这个图层就不会跳转到新的大小,它会以平滑但快速的动画形式呈现。我敢肯定这不是在动画块中调用的。为了进一步调试,我还在相同的作用域中动画化了UIView的帧,而它不动画化。

我是新来的CALayers,所以也许我做错了什么。

大多数CALayer的属性默认是动画的。你需要禁用这些隐式动画:

[CATransaction begin];
[CATransaction setValue:(id)kCFBooleanTrue forKey:kCATransactionDisableActions];
// change layer's properties
_gradient.frame = newFrame;
[CATransaction commit];

这是一个很好的例子来帮助你学习核心动画

From the Core Animation Programming Guide:

"改变一个可动画图层属性的值会导致该图层隐式地动画化从旧值到新值的变化。"

如果你不想要动画,你需要告诉iOS不要显式地使用:

[CATransaction begin];
[CATransaction setAnimationDuration:0.0];
_gradient.frame = CGRectMake(0, 480-toHeight, 320, toHeight);
[CATransaction commit];

祝你好运!

最新更新