首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何在UIPanGestureRecognizer中使用translationInView:以获得不可见的滑块效果?

如何在UIPanGestureRecognizer中使用translationInView:以获得不可见的滑块效果?
EN

Stack Overflow用户
提问于 2013-04-09 06:57:45
回答 1查看 4.4K关注 0票数 3

作为一种快捷方式(绝对不是必须的),我在视图上有一个UIPanGestureRecognizer,允许用户上下滑动他/她的手指来快速设置值,但我在完全实现这一点上遇到了麻烦。

我想让它向上或向下平移一定的距离,以按比例增加或减少该值。

我试着使用translationInView:,但它似乎只更新了几次,除非我平移得非常慢,除非我用错了。

代码语言:javascript
复制
- (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);
        }
    }
}

如果我缓慢地拖动,变量的值将相对较快地攀升,但如果我非常快地在屏幕上滑动手指,它几乎不会调整该值。我想要的恰恰相反;缓慢的运动允许精细的控制,而快速的运动允许更快的变化。

我到底该如何去实现它呢?它并不像现在这样工作得很好。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2013-04-09 09:56:40

你的算法的问题是,只有当它恰好是10的倍数时,它才会注册更改。随着平移速度的加快,每个注册的translation.y可能会发生大于1的变化,因此并不是所有的精确倍数都会注册,从而导致增量更少,而不是更多。

只要它超过10,您就需要注册更改,然后重置为零。

代码语言:javascript
复制
- (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);
        }
}
票数 4
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/15890488

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档