我有一个正方形的CAShapeLayer,并将width设置为2.0f。
我想动画它的strokeEnd,为此我使用了一个CABasicAnimation,如下所示:
CABasicAnimation *stroke = [CABasicAnimation animationWithKeyPath:@"strokeEnd"];
stroke.fromValue = @(0);
stroke.toValue = @(1);
stroke.repeatCount = 1;
stroke.duration = 10.0f;
stroke.timingFunction = [CAMediaTimingFunction functionWithName:kCAMediaTimingFunctionLinear];
[myLayer addAnimation:stroke forKey:nil];而且它是有效的。从Matt的书中,我了解到我们完全可以通过以下方式省略toValue和fromValue:
[CATransaction begin];
[CATransaction setDisableActions:YES];
..
..
[CATransaction commit];然而,他的例子是基于transform的。我正试图用strokeEnd来实现同样的目标。
我所能做的最好是将CATransaction块中的CATransaction设置为1或0,并相应地设置fromValue。换句话说,我似乎不能同时省略toValue和endValue的动画strokeEnd -我至少需要其中之一(即fromValue或toValue)。
所以我的问题是,我怎么能不需要使用strokeEnd和fromValue就可以动画化?
谢谢。
发布于 2014-03-30 03:39:30
这里有两个非常不同的问题:
CABasicAnimation,而是直接在代码中更改该层的属性),核心动画可能会将隐式动画应用于该层(相对较快的动画,但仍然是动画)。例如,如果更改myLayer.opacity,核心动画可能会自动应用隐式动画来减弱此效果。同样,如果您直接更改myLayer.strokeEnd,它可能会激活笔划结束的变化(您将看到它很快地划出了线,而不是立即出现)。
通过使用[CATransaction setDisableActions:YES],您可以指示核心动画不要执行这些隐式动画,当您直接更改该层的属性时,这些动画可能会应用。通过使用[CATransaction setDisableActions:NO],您将重新启用隐式动画。CABasicAnimation时,有fromValue、toValue和byValue属性(根据文档,这些属性都是可选的,不应该超过两个非nil属性)。您经常会看到指定fromValue和toValue的动画。但是你想要的话,你可以指定一个,核心动画将决定其他的应该是什么。
例如,假设您刚刚创建了一个CAShapeLayer (默认情况下,strokeEnd就是1.0)。然后,如果我想将strokeEnd从0%动画化到100%,您只需使用:
CABasicAnimation *行程= CABasicAnimation动画:@“strokeEnd”;stroke.fromValue = @(0.0);stroke.duration = 1.0f;myLayer加法:笔画forKey:0;
注意,我不必指定toValue of @(1.0),因为它将自动默认为myLayer.strokeEnd的当前值(本例中恰好为1.0 )。在使用CABasicAnimation编写动画时,核心动画的这两个不同方面相互作用,您不仅希望在其中指定动画,而且还希望在动画开始之前直接更改该层的属性。
例如,如果我将一个CAShapeLayer添加为一个sublayer,但希望动画绘制它的前半部分(即从0.0到0.5的动画strokeEnd ),理论上您可能希望(a)将myLayer.shapeEnd指定为最终值(例如0.5);以及(b)创建一个CABasicAnimation,其fromValue值为@(0.0) (但您可以省略toValue,因为我们已经将层的shapeEnd设置为适当的值)。但是,回到我的答案开头的第一点,当我们直接设置一个图层属性(如myLayer.shapeEnd )时,您可能希望将setDisableActions设置为YES,因此不会尝试使用任何隐式动画(考虑到我们即将用CABasicAnimation指定所需的实际动画)。
// set the layer's strokeEnd directly (with no implicit animation)
[CATransaction setDisableActions:YES];
myLayer.strokeEnd = 0.5;
[CATransaction setDisableActions:NO];
// now animate the layer's stroke end from 0.0 to the final value,
// which, because we didn't specify `toValue`, will default to the
// current value of `myLayer.strokeEnd` (which we happened to set
// right above)
CABasicAnimation *stroke = [CABasicAnimation animationWithKeyPath:@"strokeEnd"];
stroke.fromValue = @0.0;
stroke.duration = 1.0f;
[myLayer addAnimation:stroke forKey:nil];在实践中,我发现setDisableActions通常是不必要的,但在技术上,如果您正在设置该层的属性,并且希望确保没有启动隐式动画,您可能希望使用setDisableActions,如上面所示。
但是,正如您可能从这次讨论中推断的那样,我们不需要设置toValue这一事实并不是使用CATransaction或其方法setDisableActions的直接结果。在本例中不需要toValue,因为我们在启动动画之前设置了图层的strokeEnd。我们只是碰巧使用CATransaction setDisableActions来确保在直接更改层属性时没有启动隐式动画。
https://stackoverflow.com/questions/22737339
复制相似问题