0

私は今夜​​、ジェスチャが認識されると(translation.yとvelocity.yに基づいて)すでに更新されている2つのUILabelsを取得しようと数時間を費やしました。の中に

if (recognizer.state == UIGestureRecognizerStateEnded)

ジェスチャが完了した後、UILabels の更新の減速をアニメーション化したいと考えています。を呼び出すだけで、UILabels が更新されます。

[self refreshLabels];

私は今夜​​、無残に失敗した .contentOffset.y の無限 scrollView とトラッカーを使用してこれを行うのに多くの時間を費やしました。また、上記の if ステートメントでアニメーション ブロックを使用して for および while ループを実行しようとしましたが、これも機能しませんでした。

誰か提案がありますか/以前にこれを行いましたか?

4

1 に答える 1

0

performSelector:withObject:afterDelay: を使用した refreshLabels の再帰呼び出しはどうですか?

ジェスチャが終了したら、プライベート カウンターを設定し、refreshLabels を呼び出します。refreshLabels 内で、カウンターを「所要時間」変数として使用して単純な減速曲線を計算し、結果の値を次の再帰呼び出しの遅延として使用します。

コード例:

int counter;  // Set this value to 1 when the gesture completes

- (void)refreshLabels:(id)sender{
    // Update the labels using whatever code you have

    // This code will execute the recursive deceleration
    if (counter > -1){
        float somereasonablenumber = 0.1F;
        float delaytime = (1.0-0.1)/counter; // deceleration = (finaltime-initialtime)/timetaken
        counter++;
        if (delaytime > somereasonablenumber){
            [self performSelector:@selector(refreshLabels:) withObject:nil afterDelay:delaytime];
        } else {
            counter = -1;
        }
    }

}

必要な曲線を得るには、finaltime と initialtime に使用した値をいじる必要があるかもしれません。現在、このコードは次のような遅延曲線で実行されます。

0.9s
0.45s
0.3s
0.225s
0.18s
0.15s
0.128571429s
0.1125s
于 2013-04-23T11:23:12.093 に答える