如何使用translationInView:使用UIPanGestureRecognizer来获得不可见的滑块效果?

时间:2013-04-08 22:57:45

标签: ios objective-c uigesturerecognizer uipangesturerecognizer

作为一种快捷方式(根本不需要)我在我的视图中有一个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);
        }
    }
}

如果我慢慢拖动,变量的值会相对较快地爬升,但是如果我将手指快速地向上滑动屏幕,它几乎不会调整值。我希望与此完全相反;慢速运动允许精细控制,而快速运动允许更快的变化。

我将如何实现这一目标?它不能很好地工作。

1 个答案:

答案 0 :(得分:4)

您的算法的问题在于它只会在恰好是十的精确倍数时记录更改。当您平移更快时,每个注册的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);
        }
}