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

您的算法的问题在于,它仅在恰好是十的倍数时才记录更改。随着平移速度的加快,每个注册的 translation.y 可能会更改 >1,因此并非所有精确的倍数都注册,导致增量更少,而不是更多。

您想在超过十时注册更改,然后重置为零。

- (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 回答