3

uiviewが描くグラフを実装しようとしています。左/右のスライドをアニメーション化するための3つのUIViewがあります。問題は、UIViewアニメーションをキャンセルできないことです。そこで、UIViewをCALayerに置き換えました。さて、問題は、CALayerがこれに適用できるかどうかです。このようにCALayerを描画するのは正常ですか?また、フレームのプロパティを操作するときにCALayerが非常に遅いのはなぜですか。

CGRect frame = curve.frame;
frame.origin.x -= diffX;
[curve setFrame:frame];

代替案はありますか?

PS私はドイツ人です。間違いでごめんなさい。


CATransactionを使用してアニメーションを取得しましたが、次にCABasicAnimationを使用して斧の動きをアニメーション化します。レイヤーの位置が前のxに戻ることを期待しても問題ありません。

CABasicAnimation *theAnimation; 
theAnimation = [CABasicAnimation animationWithKeyPath:@"position"]; 
theAnimation.delegate = self;
theAnimation.duration = 1.0;
theAnimation.timingFunction = [CAMediaTimingFunction functionWithName:kCAMediaTimingFunctionEaseOut];
CGPoint position = [[curves objectAtIndex:i]position];
position.x = [[curves objectAtIndex:i]position].x - diffX;
[theAnimation setToValue:[NSValue valueWithCGPoint:position]];
[[curves objectAtIndex:i] addAnimation:theAnimation forKey:[NSString stringWithFormat: @"translate.x.%d", index]];

位置は位置を変更しますが(たとえば、xStart = 100、xEnd = 200)、アニメーションが終了すると、レイヤーは最初のxに戻ります(たとえば、x = 100)。それは正常ですか?終了位置がもう変わらないというこの問題をどのように解決できますか?removeOnCompleteプロパティを変更しようとしましたが、効果がありませんでした。

助けを願っています。

マーカス

4

2 に答える 2

1

「遅い」とはどういう意味かわかりませんが、この方法で CALayer のフレームを設定すると、「暗黙的なアニメーション」が使用されます。つまり、古いフレームから新しいフレームへの移行をアニメーション化します。これをオフにすることができます:

[CATransaction begin];
[CATransaction setValue: (id) kCFBooleanTrue forKey: kCATransactionDisableActions];
[curve setFrame:frame];
[CATransaction commit];

ただし、これは通常、CALayerの利点と見なされます。ここでは UIView を使用したいだけですが、デフォルトでは、このようなトランジションはアニメーション化されません。

于 2010-04-08T10:42:42.473 に答える
0

アニメーションで移動先の位置を設定する代わりに、移動したいものの位置プロパティを設定するだけです。

addAnimation:theAnimation を追加すると、指定した keyPath プロパティへの変更の「ビジュアル スタイル」が設定されます。

アニメーションがアタッチされているオブジェクトの位置を (0,0) から (500,500) に変更すると、CoreAnimation がその変更をアニメーション化します。theAnimation オブジェクトには開始位置と終了位置が必要ありません。これは、基になるオブジェクトにあるためです。

于 2010-09-15T22:31:28.637 に答える