在 UIView 动画块中,有没有办法获取当前动画的持续时间?
[UIView animateWithDuration:1.0 animations:^{
// float duration = ?
}];
在 UIView 动画块中,有没有办法获取当前动画的持续时间?
[UIView animateWithDuration:1.0 animations:^{
// float duration = ?
}];
如果您的目标是iOS 9.0
或更高版本,那么您正在寻找一个UIView
名为的类属性inheritedAnimationDuration
。
用法:
let currentAnimationDuration = UIView.inheritedAnimationDuration
来自苹果文档:
概括
返回当前动画的继承持续时间。
讨论
UIView
如果在动画块中调用此方法,则仅返回非零值。
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];
[CATransaction animationDuration]
is what you're looking for
既然您使用的是块,为什么不直接用它来捕获一个变量呢?
CGFloat duration = 1.0;
[UIView animateWithDuration:duration animations:^{
CGFloat theDuration = duration;
}];
您可以很容易地获得当前动画。例如,设置一个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];