如果 a 中有5个动画CAAnimationGroup
,g1
我必须计算 的持续时间g1
,我想知道是否有一种方法g1
可以自动计算运行它的所有动画的持续时间。
问问题
732 次
1 回答
2
使用一点“ valueForKeyPath
-magic”,您可以很容易地获得组中所有动画的最长持续时间。
// The longest of all the durations in the group.
NSNumber *groupDuration = [group.animations valueForKeyPath:@"@max.duration"];
然后你可以用这个值做任何你想做的事情。因此NSSNumber
,如果要将其设置为组的持续时间,则需要获取 float 或 double 值。
group.duration = [groupDuration doubleValue];
编辑
正如Duncan C指出的那样:上面计算总持续时间的代码只有在所有动画都立即开始时才有效。解决这个问题的一种方法可能是添加一个类别CAAnimation
,为endTime
. 像这样:
// CAAnimation+EndTime.h
@interface CAAnimation (EndTime)
@property (nonatomic, assign, readonly) CGFloat endTime;
@end
// CAAnimation+EndTime.m
@implementation CAAnimation (EndTime)
- (CGFloat)endTime {
CGFloat endTime = self.duration;
if (self.beginTime > 0.0) {
endTime+= self.beginTime - CACurrentMediaTime();
}
return endTime;
}
@end
有了该类别,您可以使用上面的 valueForKeyPath: 方法,如下所示
// The latest end time of all the animations in the group.
NSNumber *groupDuration = [group.animations valueForKeyPath:@"@max.endTime"];
笔记
我endTime
上面的实现不会涵盖所有情况来计算动画的实际结束时间。例如,它不考虑 timeOffset 或具有相对于当前时间以外的其他事物的开始时间的动画。然而,它确实考虑了两种最常见的情况:立即开始并从“现在”开始一些书籍。
于 2013-03-07T08:10:02.983 回答