为啥我的 CAGradientLayer 为所有更改设置动画?

Posted

技术标签:

【中文标题】为啥我的 CAGradientLayer 为所有更改设置动画?【英文标题】:Why is my CAGradientLayer animating all changes?为什么我的 CAGradientLayer 为所有更改设置动画? 【发布时间】:2011-10-22 06:39:53 【问题描述】:

我有一个CAGradientLayer,我想在用户拖动手指时对其进行缩放。但是,当我设置框架时,图层会动画到新的大小。其他属性也会出现这种情况,包括 start/endPoint。

这是一个例子:

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

然而,如果我只在用户拖动 10 个左右像素时调用它,图层不会简单地跳转到新大小,它会以平滑但快速缓和的动画进行动画处理。我很肯定这不会在动画块中调用。为了进一步调试,我还在同一范围内为UIView 的框架设置了动画,并且没有动画。

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

【问题讨论】:

你把你的代码包在里面了吗..[UIView beginAnimations:nil context:NULL];,它是commit..或者你打开它后忘记了commit?正如@mjisrawi 所说..发布一些代码.. 【参考方案1】:

CALayer 的大部分属性默认是动画的。您需要禁用这些隐式动画:

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

Here is a good sample 帮助你学习核心动画。

【讨论】:

【参考方案2】:

来自核心动画编程指南:

“更改可动画层属性的值会导致层隐式地对从旧值到新值的变化进行动画处理。”

所以如果你不想要动画,你需要告诉 ios 不要明确地使用动画:

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

祝你好运!

【讨论】:

以上是关于为啥我的 CAGradientLayer 为所有更改设置动画?的主要内容,如果未能解决你的问题,请参考以下文章

为啥在使用 CAGradientLayer 时应用会崩溃

为啥我不能在 ARC 中使用自定义颜色创建 CAGradientLayer?

为啥在模态视图控制器被解除后 CAGradientLayer 从视图中删除

为啥我无法使用 CAGradientLayer 的掩码

UIButton 上奇怪的 CAGradientLayer 错误

iOS - 将 CAGradientLayer 集中到父 UIView