2013-08-22 1 views
26

私はCGPathを含むCAShapeLayerを持っています。2つのCGPath/UIBezier間のTweening/Interpolating

CABasicAnimation *morph = [CABasicAnimation animationWithKeyPath:@"path"]; 
    morph.fromValue = (id)myLayer.path; 
    mayLayer.path = [self getNewPath]; 
    morph.toValue = (id)myLayer.path; 
    morph.duration = 0.3; 
    [myLayer addAnimation:morph forKey:nil]; 

完璧に動作します:ビルトインのiOSのアニメーションを使用すると、私は簡単にアニメーションを使用して別の一つに、このパスをモーフィングすることができます。

ただし、ドラッグ操作中にこれらのパスの間を徐々にモーフしたいと思います。これを行うには、ドラッグ中の任意のポイントで補間されたパスを取得できる必要があります。これについてiOSに尋ねる方法はありますか?

+0

単純なケースでは、組み込みのパスのモーフィングは、非常に迅速に役に立たなくなります。ここに記載されている問題と説明を参照してください:http://stackoverflow.com/a/17864445/438982 – ipmcc

+0

それは本当ですが、私の場合はモーフィングがよく見えます... – tarmes

答えて

77

これは、実際にははるかに単純です。まず、「いいえ」速度(一時停止)のアニメーションを考えて使用します。一時停止したアニメーションをレイヤーに追加すると、時間オフセットを変更してアニメーション内の特定の時間にジャンプすることができます。

アニメーションを単独で実行することを計画していない場合(つまり、手動でのみ制御する場合)、アニメーションの期間を1に変更することをお勧めします。これは、移動すると時間オフセットを0から1に変更することを意味します0%から100%の範囲である。期間が0.3の場合(例のように)、時間オフセットを0から0.3の間の値に設定します。

実装

私は上記に述べたように、この小さなトリックに関わる非常にわずかなコードがあります。

  1. (私の例のように)を設定1.0
  2. に持続層のspeed(はい、彼らはCAMediaTimingに準拠)またはドラッグジェスチャやスライダーの間に0.0
  3. にアニメーションを設定します(オプション)手順2で行った操作に応じて、レイヤーまたはアニメーションのtimeOffsetを設定します。

    - (IBAction)sliderChanged:(UISlider *)sender { 
        self.shapeLayer.timeOffset = sender.value; // Step 3 
    } 
    

    あなたは以下の最終結果を見ることができます:

は、これは私が私のアニメーション+形層

CABasicAnimation *morph = [CABasicAnimation animationWithKeyPath:@"path"]; 
morph.duration = 1.; // Step 1 
morph.fromValue = (__bridge id)fromPath; 
morph.toValue = (__bridge id)toPath; 
[self.shapeLayer addAnimation:morph forKey:@"morph shape back and forth"]; 

self.shapeLayer.speed = 0.0; // Step 2 

とスライダアクションの構成方法です。ハッピーコーディング!

enter image description here

+0

素晴らしいです、ありがとう。私はtimeOffsetの存在を知らなかった。アニメーションを単独で使用する予定がある場合はどうしますか? – tarmes

+0

@tarmesそれは相互作用の詳細に依存します。アニメーションを一時停止して、時間オフセットを変更することもできます(この場合、0〜0.3)。速度を再び1に戻して、アニメーションを再開することができます。アニメーションが動作しているときにインタラクトしたい場合は、 '[layer convertTime:CACurrentMediaTime()fromLayer:nil]'を使って現在の値を取得できます。詳細については、[この回答](http://stackoverflow.com/a/3003922/608157)を参照してください。 –

+6

この素晴らしいテクニックは、私が2つの間にうまく変形している►(再生)または❚❚(一時停止)アイコンでボタンをするように促しました。実際にそれを見てください:http://instgraduate.com/p/l6a8uDHDk7そして、ここにソースがあります:http://gist.github.com/raphaelschaad/9734463 –

関連する問題