找出当前动画块的动画持续时间。

14

在UIView动画块内,有没有一种方法可以获取当前动画的持续时间?

[UIView animateWithDuration:1.0 animations:^{    // float duration = ?}];

我不确定我理解你的意思,难道动画持续时间不是1.0吗? - Mick MacCallum
4
是的,但我正在块内使用需要知道持续时间的组件,而我不想将持续时间作为变量传递。 - adamsiton
好问题 +1,抱歉我无法提供帮助。 - Mick MacCallum
我认为没有变量是不可能的... 不使用它有特别的原因吗? - Giuseppe Garassino
5个回答

5
如果你的目标是 iOS 9.0 或更高版本,则需要查找 UIView 的一个类属性,名为 inheritedAnimationDuration。
使用方法如下:
let currentAnimationDuration = UIView.inheritedAnimationDuration

来自Apple文档:

概要

返回当前动画的继承持续时间。

讨论

仅在调用时位于UIView动画块内,此方法才返回非零值。


谢谢,它节省了我很多时间。 - Amir Ehsanijam

3
TL;DR: 使用CALayer的-actionForKey:而不是-animationForKey:
当从动画块中调用受影响的setter时,@Dimitri Bouniol的答案对我没有起作用。据我所知,原因在于UIView的动画系统在开始实际动画之前设置状态(并在开始实际动画之前调用setter)。但对我有效的是调用图层上类似的-actionForKey:方法。返回的动作确实设置了适当的持续时间,并且可以像他的答案中一样使用。
CAAnimation *animation = (CAAnimation *)[self.layer actionForKey@"position"]; // or property of interest

[CATransaction begin];
[CATransaction setAnimationDuration:animation.duration];
[CATransaction setAnimationTimingFunction:animation.timingFunction];

// CALayer animation here

[CATransaction commit];

在iOS 11中无法工作。actionForKey:返回一个符合CAAction协议但不是CAAnimation_UIViewAdditiveAnimationAction。因此,timingFunction属性不存在。@Dimitri Bouniol的答案对我有效。 - Ortwin Gentz

1
"

[CATransaction animationDuration] 是你要找的

"

1
很遗憾,这不起作用,UIView动画块显然不能直接与CATransaction一起使用。 - Patrick Pijnappel

0

既然你正在使用块,为什么不直接用它来捕获变量呢?

CGFloat duration = 1.0;
[UIView animateWithDuration:duration animations:^{ 
    CGFloat theDuration = duration; 
}];

同意。我们已经传递了持续时间,为什么还要找另一种方式呢? - Mrug

0

您可以轻松地获取当前动画。例如,设置一个CATransaction

CAAnimation *animation = [self.layer animationForKey:self.layer.animationKeys.firstObject];
[CATransaction begin];
[CATransaction setAnimationDuration:animation.duration];
[CATransaction setAnimationTimingFunction:animation.timingFunction];

// CALayer animation here

[CATransaction commit];

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接