2012-04-05 103 views
13

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

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

我不知道我明白你的意思,动画持续时间不是1.0吗? – 2012-04-05 08:14:14

+2

是的,但我在块内部使用了需要知道持续时间的组件,并且我不想将持续时间作为变量 – adamsiton 2012-04-05 08:16:54

+0

好问题+1抱歉,我忍不住。 – 2012-04-05 08:22:26

回答

0

由于您使用的是块,为什么不只是捕获一个变量呢?

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

同意。我们已经通过了持续时间,为什么我们应该找到另一种方式。 – Mrug 2014-04-11 11:51:19

2

[CATransaction animationDuration]是你在找什么

+0

不幸的是,这不起作用,UIView动画块显然不直接与CATransaction一起工作。 – 2013-10-22 04:32:42

2

你可以得到当前的动画很轻松了。例如,建立一个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]; 
2

TL; DR:从一个调用时

@Dimitri Bouniol的回答并没有为我工作:使用的CALayer -actionForKey :,不-animationForKey受影响的setter动画块内。据我了解,原因是UIView的动画系统在开始实际动画之前设置状态(并在开始实际动画之前调用设置器)。对我来说,虽然在图层上调用了类似的-actionForKey:方法,但对我来说还是有效的。返回的行为确实具有适当的持续时间设置,并且可以在他的回答中使用。

CAAnimation *animation = (CAAnimation*) 
[self.layer [email protected]"position"]; // or property of interest 

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

// CALayer animation here 

[CATransaction commit]; 
相关问题