1

ユーザーが UIView をどこかにドラッグしたシナリオがあります。開始した場所に戻したいのですが、ユーザーがドラッグしたのと同じトラックに沿って、同じ速度で戻りたいと思っています。次のような再帰的なソリューションを思いつきました。

@property (...) NSMutableArray *dragTrack; // recorded during pan gesture

- (void)goHome
{
        [self backtrack: [self.dragTrack count] 
                         withDelay: 1.0 / [self.dragTrack count]];  
                 // interim version of delay; will implement accurate timing later
}

- (void)backtrack: (int)idx withDelay: (double)delay
{
    if (idx > 0){
        [UIView animateWithDuration:0 delay:delay options: 0
        animations: ^{
            self.center = [[self.dragTrack objectAtIndex:idx - 1] CGPointValue];
        }
        completion:^(BOOL finished){
            [self backtrack: idx - 1 withDelay: delay];
        }];
    } else {
        // do cleanup stuff
    }
}

これは機能し、再帰の深さは問題ではないようです。私のドラッグ トラックは通常、数百ポイントの長さしかありません。(バックトラックへの再帰呼び出しが末尾呼び出しを最適化する可能性はかなり低いと思いますか?)。しかし、私はまだ疑問に思っています:これは私が達成しようとしていることに対する合理的/通常/安全な解決策ですか? または、タイムスタンプと状態のコレクションをアニメーションに渡し、「これらを再生する」と言うより簡単な方法はありますか?

4

1 に答える 1

0

そこで再帰を引き起こしていません。完了ブロックは非同期で呼び出されるため、関数スタックに深く入り込むことはありません。そこにブレークポイントを設定し、スタック トレースを確認することで、自分で確認できます。理論的に無限回トリガーし、再帰を引き起こさない
ことを想像できます。NSTimer

2 つ目の質問ですが、このようなアニメーションを作成できます。それは呼び出され、フレームワークCAKeyframeAnimationの一部ですQuartzCore。ビューの代わりにレイヤーを操作する必要がありますが、それほど難しくありませ

コードに 1 つだけ注意してくださいUIViewAnimationOptionCurveLinear。アニメーションをよりスムーズにするオプションを使用してみてください。

于 2013-01-28T21:24:13.283 に答える