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