CAAnimationGroup可以根据动画中的动画自动确定持续时间吗?

时间:2013-03-07 07:16:37

标签: ios core-animation

如果CAAnimationGroupg1中有 5个动画,我必须计算g1的持续时间,我想知道是否有办法g1可以自动计算运行其所有动画的持续时间。

1 个答案:

答案 0 :(得分:2)

你可以通过一点点“valueForKeyPath - magic”轻松获得群组中所有动画的最长持续时间。

// The longest of all the durations in the group.
NSNumber *groupDuration = [group.animations valueForKeyPath:@"@max.duration"];

然后你可以用这个值做任何你想做的事。它是NSSNumber,因此如果要将其设置为组的持续时间,则需要获取浮点值或双精度值。

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或具有相对于当前时间以外的其他内容的开始时间的动画。然而,它确实需要考虑两种最常见的情况:立即开始并从“现在”开始一些书。