14

在 UIView 动画块中,有没有办法获取当前动画的持续时间?

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

5 回答 5

5

如果您的目标是iOS 9.0或更高版本,那么您正在寻找一个UIView名为的类属性inheritedAnimationDuration

用法:

let currentAnimationDuration = UIView.inheritedAnimationDuration

来自苹果文档

概括

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

讨论

UIView如果在动画块中调用此方法,则仅返回非零值。

于 2019-10-22T11:33:11.230 回答
2

TL;DR:使用 CALayer -actionForKey:,而不是 -animationForKey:

@Dimitri Bouniol 从动画块内受影响的设置器调用时,我的答案对我不起作用。据我了解,原因是 UIView 的动画系统在开始实际动画之前设置状态(并在开始实际动画之前调用设置器)。对我有用的是在图层上调用类似的 -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];
于 2014-04-30T22:33:16.407 回答
1

[CATransaction animationDuration] is what you're looking for

于 2012-09-24T14:34:03.863 回答
0

既然您使用的是块,为什么不直接用它来捕获一个变量呢?

CGFloat duration = 1.0;
[UIView animateWithDuration:duration animations:^{ 
    CGFloat theDuration = duration; 
}];
于 2012-04-13T19:28:54.367 回答
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];
于 2014-04-10T05:10:53.457 回答