2011-09-14 15 views
3

iOSでは、サイズが縮小され、フェードアウトして消えていく間に円弧で画面全体を飛んでいくエフェクトを作成しようとしています。私はCAAnimationGroupでこれらの3つの効果を達成しました。問題は、アニメーションが終了し、ビューが元の位置に戻って表示され、フルサイズと完全な不透明度が表示される場合です。私は以下のコードで間違って何をしているのか誰にでも見えますか? アニメーションを元の位置に戻すべきではありませんが、最後にはアニメーションが消えます。完了時にCAAnimationGroupが元の位置に戻ります。

UIBezierPath *movePath = [UIBezierPath bezierPath]; 
CGPoint libraryIconCenter = CGPointMake(610, 40); 

CGPoint ctlPoint = CGPointMake(self.imgViewCropped.center.x, 22.0); 
movePath moveToPoint:self.imgViewCropped.center]; 
[movePath addQuadCurveToPoint:libraryIconCenter 
       controlPoint:ctlPoint]; 

CAKeyframeAnimation *moveAnim = [CAKeyframeAnimation animationWithKeyPath:@"position"]; 
moveAnim.path = movePath.CGPath; 
moveAnim.removedOnCompletion = NO; 

CABasicAnimation *scaleAnim = [CABasicAnimation animationWithKeyPath:@"transform"]; 
scaleAnim.fromValue = [NSValue valueWithCATransform3D:CATransform3DIdentity]; 
scaleAnim.toValue = [NSValue valueWithCATransform3D:CATransform3DMakeScale(0.1, 0.1, 1.0)]; 
scaleAnim.removedOnCompletion = NO; 

CABasicAnimation *opacityAnim = [CABasicAnimation animationWithKeyPath:@"alpha"]; 
opacityAnim.fromValue = [NSNumber numberWithFloat:1.0]; 
opacityAnim.toValue = [NSNumber numberWithFloat:0.0]; 
opacityAnim.removedOnCompletion = NO; 

CAAnimationGroup *animGroup = [CAAnimationGroup animation]; 
animGroup.animations = [NSArray arrayWithObjects:moveAnim,scaleAnim,opacityAnim, nil]; 
animGroup.duration = 0.6; 
animGroup.delegate = self; 
animGroup.removedOnCompletion = NO; 
[self.imgViewCropped.layer addAnimation:animGroup forKey:nil]; 

答えて

7

私はあなたがkCAFillModeForwardsにあなたのアニメーションのfillModeプロパティを設定する必要があります信じています。終了時にアニメーションをフリーズする必要があります。もう一つの提案(正直なところ、これは私が通常やっていることです)は、アニメーションを設定した後、レイヤー自体のプロパティを最終的な位置に設定することです。このようにしてアニメーションが削除されると、レイヤーはモデルの一部として最終的なプロパティを保持します。

CAAnimationGroupに含まれているアニメーションの脇には、removedOnCompletionのフラグは無視されます。彼らは間違っているので、おそらくそれらの割り当てを削除する必要があります。上記の指定に従って、fillModeへの代入で置き換えます。

+0

私は提案したようにfillModeを設定しましたが、UIImageViewは、アニメーションが終了すると元の位置に戻ります。アニメーションブロックの後に 'self.imgViewCropped.layer.frame = CGRectMake(610、-40、40、40);'を追加しましたが、アニメーションを実行する前に直ちに有効になります。 – Paul

+0

実際に私のコードはこのチュートリアルに基づいています... [リンク] http://nachbaur.com/blog/core-animation-part-3しかし、これは元の画像にbaxckが再表示されるという同じ問題を抱えていますアニメーションが終了するときの位置。 – Paul

+1

@Paul:代わりに 'self.imgViewCropped.layer.position'を設定しようとしましたか?そして、間違いなくそこにまっすぐに飛び乗るべきではありません。あなたのアニメーションはフルパスを指定しているので、現在の値から引き出すのではなく、アニメーションの位置の値は、レイヤーが使用しようとしているものを上書きします。 –

関連する問題