3

ショートカットとして (決して必要ではありません)、ビューに UIPanGestureRecognizer があり、ユーザーが指を上下にスライドさせて値をすばやく設定できるようにしていますが、これを完全に実装するのに問題があります。

特定の距離を上下にパンすると、それに比例して値が増減するようにしたいと考えています。

を使用しようとしましtranslationInView:たが、間違って使用していない限り、非常にゆっくりとパンしない限り、数回しか更新されないようです。

- (IBAction)handlePan:(UIPanGestureRecognizer *)recognizer {
    CGPoint velocity = [recognizer velocityInView:recognizer.view];

    NSNumber *WPM = [[NSUserDefaults standardUserDefaults] objectForKey:@"WPM"];

    // If user is panning upward
    if (velocity.y < 0) {
        CGPoint translation = [recognizer translationInView:recognizer.view];

        if (fmodf(translation.y, 10) == 0) {
            WPM = @([WPM intValue] + 5);
            [[NSUserDefaults standardUserDefaults] setObject:WPM forKey:@"WPM"];
            NSLog(@"%@", WPM);
        }
    }
    // If user is panning downward
    else if (velocity.y > 0) {
        CGPoint translation = [recognizer translationInView:recognizer.view];
        if (fmodf(translation.y, 10) == 0) {
            WPM = @([WPM intValue] - 5);
            [[NSUserDefaults standardUserDefaults] setObject:WPM forKey:@"WPM"];
            NSLog(@"%@", WPM);
        }
    }
}

ゆっくりドラッグすると、変数の値は比較的速く上昇しますが、画面上で指を非常に速くスライドさせると、値はほとんど調整されません。これとは正反対のことが必要です。ゆっくりとした動きは細かい制御を可能にし、速い動きは素早い変化を可能にします。

これを実装するにはどうすればよいですか?このままではうまく機能しません。

4

1 に答える 1

4

アルゴリズムの問​​題は、たまたま正確に 10 の倍数である場合にのみ変更を登録することです。より高速にパンすると、登録された各 translation.y が 1 を超える可能性があるため、すべての正確な倍数が登録されるとは限らず、増加するのではなく減少する結果になります。

10を超えるたびに変更を登録し、ゼロにリセットします。

- (IBAction)handlePan:(UIPanGestureRecognizer *)recognizer {
    NSNumber *WPM = [[NSUserDefaults standardUserDefaults] objectForKey:@"WPM"];
    CGPoint translation = [recognizer translationInView:recognizer.view];
    if (translation.y<-10 || translation.y>10) {
        int sign = (translation.y>0)?-1:1;
            [recognizer setTranslation:CGPointMake(0, 0) inView:self.view];
            WPM = @([WPM intValue] + sign*5);
            [[NSUserDefaults standardUserDefaults] setObject:WPM forKey:@"WPM"];
            NSLog(@"%@", WPM);
        }
}
于 2013-04-09T01:56:40.213 に答える