3

CAKeyframeAnimationを使用してUIImageViewを画面上で移動すると、断続的な問題が発生します。UIImageViewの位置は、アニメーションが終了したときに終了する場所のままにしておきたいです。このバグは、特定の開始点と終了点でのみ発生します。ランダムポイントを使用すると、ほとんどの場合正しく機能しますが、約5〜15%の確率で失敗し、アニメーション前の位置に戻ります。この問題は、pathプロパティを使用してCAKeyframeAnimationを使用する場合にのみ発生します。valuesプロパティを使用すると、バグは表示されません。removeOnCompletion = NO、fillMode=kCAFillModeForwardsを設定しています。以下にテストXcodeへのリンクを投稿しました。これがアニメーションを設定するための私のコードです。プロパティusePathがあります。これがYESの場合、バグが発生します。usePathをNOに設定すると、スナップバックのバグは発生しません。

// create the point        
CAKeyframeAnimation *moveAnimation = [CAKeyframeAnimation animationWithKeyPath:@"position"];
if (self.usePath) {
    CGMutablePathRef path = CGPathCreateMutable();
    CGPathMoveToPoint(path, NULL, startPt.x, startPt.y);
    CGPathAddLineToPoint(path, NULL, endPt.x, endPt.y);
    moveAnimation.path = path;
    CGPathRelease(path);    
} else {
    moveAnimation.values = [NSArray arrayWithObjects:
                            [NSValue valueWithCGPoint:startPt],
                            [NSValue valueWithCGPoint:endPt],
                            nil];
}
moveAnimation.calculationMode = kCAAnimationPaced;
moveAnimation.duration = 0.5f;
moveAnimation.removedOnCompletion = NO;
// leaves presentation layer in final state; preventing snap-back to original state
moveAnimation.fillMode = kCAFillModeForwards; 
moveAnimation.timingFunction = [CAMediaTimingFunction functionWithName:kCAMediaTimingFunctionEaseOut];
// moveAnimation.delegate = self;    

// start the animation
[ball.layer addAnimation:moveAnimation forKey:@"moveAnimation"];

テストプロジェクトをダウンロードして表示するには、テストプロジェクトに移動しますhttp://www.24x7digital.com/downloads/PathFillModeBug.zip

[ボールを移動]ボタンをタップして、ボールのアニメーションを開始します。バグが毎回発生する原因となる開始点と終了点をハードコーディングしました。スイッチを使用して、usePathをYESまたはNOに変更します。usePathがYESの場合、スナップバックのバグが表示されます。usePathがNOの場合、スナップバックのバグは表示されません。

SDK 3.1.3を使用していますが、SDK 3.0を使用してこのバグを確認し、SimとiPhoneでバグを確認しました。

これを修正する方法や、何か間違ったことをしている場合のアイデアをいただければ幸いです。ありがとう、マーク。

4

1 に答える 1

7

idp-dts@apple.comに連絡した後、パスを使用したkCAFillModeForwardsに関してCoreAnimationにバグがあることを確認しました。彼らは私が行ったバグレポートを提出するように私に言いました(問題ID:7797921)。

彼らは私に回避策を与えようとしました。彼らは、私がアニメーションを開始した直後に終了点の位置を設定すると言いました。これにより、バグが発生したときに位置がスナップバックするのを防ぎます。

// start the animation
[ball.layer addAnimation:moveAnimation forKey:@"moveAnimation"];
ball.layer.position = endPt;

しかし、実際のアプリでは、rotationMode = kCAAnimationRotateAutoを設定して、オブジェクトのz回転が更新され、パスに接するようにしました。したがって、スナップバックが発生すると、rotationModezの回転は失われます。彼らは私にanimationDidStop:finishedで明示的に回転を設定するように言った:そのように:

[ball.layer setValue:[NSNumber numberWithDouble:-M_PI/2.0] forKeyPath:@"transform.rotation.z"];

スナップバック回転と補正回転のちらつきが発生することがあるため、これで問題が完全に解決するわけではありません。パスのバグでfillMode=kCAFillModeForwardsが修正されることを期待しています。

于 2010-03-26T16:53:31.343 に答える