1

で説明されているものと同様に、ビューのアニメーションのようなジグルを行うことに興味があります

ios-icon-jiggle-algorithmおよびerror-in-button-jiggle-algorithm

ただし、これらのソリューションは時不変のアニメーションを実装します。つまり、アニメーションの開始前にアニメーション シーケンスが固定され、まったく同じアニメーションが何度も実行されます。これらの場合、回転角度は事前に計算されます。

私がやりたいのは、アニメーションが時間とともに変化する時アニメーションです。前の例に関しては、時間ベースの関数に応じて回転角度を変化させたいと考えています。

実生活で例えると、ゼリーの塊を動かしていると想像してください。アニメーションの開始時にゼリーを 1 回たたくと、ゼリーが揺れ始め、時間の経過とともに揺れの大きさが徐々に小さくなり、まったく揺れなくなります。

私の理解では、アニメーション ブロックに時変値を挿入することはできません。可能な唯一の方法は、固定アニメーションの文字列をios-multiple-animation-blocksに従って連鎖させることです。減少するアニメーション値の 3 つまたは 4 つのブロックをつなぎ合わせると、許容できる効果が得られるはずです。

それで、UIView アニメーションで私がやりたいことをする方法があれば? または、別のアプローチに従う必要がありますか?

[編集]

時変の意味をもう少し明確にするために、アニメーション化されたプロパティをアプリオリに事前計算することなく、アニメーション化されたプロパティの値を関数時間として指定できるようにしたいと考えています。そして、(おそらく)その場で関数を変更できるようにすることです。具体的な例として、次のような関数 f(t) が必要になる場合があります。

For t<0 f(t) = 0
For t>0 and t<1 f(t) = 1-t
For t>1 f(t)= 0

実際には、af(t) のより適切な表現は次のようになります。

f(t) = A(t)sin(t)

[編集#2]

いくつかの検討の結果、理想的には時変ビュー アニメーションを指定できるようにすることは、私がやりたい効果であると判断しましたが、実用的には、それをアプリに適用すると、ユーザーは私のプログラミングの素晴らしさに気付かないでしょう。だから私はそれを偽造して、事前に計算され、複数回トリガーされるキーフレームアニメーションを使用します.

4

1 に答える 1

0

申し訳ありませんが、UIView アニメーションでは、完了ブロックで次のトリガーをトリガーして複数のアニメーションを連鎖させずにそれを行うことはできません。実際に行うべきではありません。

しかし、心配しないでください。あなたがしなければならないことはそれほど難しいことではありません。

Core Animation は、プロパティがアニメーション化する値の配列を指定できるプロパティのキー フレーム アニメーションをサポートします。プロパティがその値を読み取るパスを指定することもできます。

値の配列を指定すると、値の間の時間と補間 (指定された値の間の計算) の実行方法を細かく制御できます。

このような新しいアニメーションを作成します

CAKeyframeAnimation *myJiggleAnimation = [CAKeyframeAnimation animationWithKeyPath:nameOfPropertyBeingAnimated];
// example key paths could be @"position" or @"transform"
[myJiggleAnimation setValues:[NSArray arrayWithValues:/* your values here */]];

オブジェクトを NSArray に追加しているため、それらはオブジェクトに含まれている必要があります。数値の場合、これはNSNumbers を使用することを意味します。このようなポイント、長方形、または変換には、NSValueこれらをラップできるというクラスがあります。

[NSValue valueWithCGPoint:myPoint]; 
[NSValue valueWithCGSize:mySize];
[NSValue valueWithCGRect:myRect]; 
[NSValue valueWithCATransform3D:myTransform]; // 3D transform
[NSValue valueWithCGAffineTransform:myAffineTransform]; // 2D transform 

次に、アニメーションを実行するには、このように、アニメーション化する必要があるビューのレイヤーに追加します

[[myView layer] addAnimation:myJiggleAnimation forKey:@"jiggle"];
// The key is used so that you can reference the animation if you have to

アニメーションの最後では、animated プロパティの値は変更されていないため、ビューが元の状態に戻ったように見える場合があることに注意してください。これは予期される動作です。別の値で終了するには、アニメーションをレイヤーに追加した後、プロパティを終了値に設定するだけです。


注:QuartzCore.framework Core Animation であるため、プロジェクトにインポートし<QuartzCore/QuartzCore.h>てコードに含める必要があります。

于 2012-07-17T21:28:43.497 に答える