に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
これを回避する 1 つの方法は、 のメソッドを追加するカテゴリを onに追加すること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 が考慮されていないか、現在の時間以外の開始時間を持つアニメーションは考慮されていません。ただし、最も一般的な 2 つのケースが考慮されます。すぐに開始する場合と、「今」からいくつかの本を開始する場合です。
于 2013-03-07T08:10:02.983 に答える