作为一种快捷方式(绝对不是必须的),我在视图上有一个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);
}
}
}如果我缓慢地拖动,变量的值将相对较快地攀升,但如果我非常快地在屏幕上滑动手指,它几乎不会调整该值。我想要的恰恰相反;缓慢的运动允许精细的控制,而快速的运动允许更快的变化。
我到底该如何去实现它呢?它并不像现在这样工作得很好。
发布于 2013-04-09 09:56:40
你的算法的问题是,只有当它恰好是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);
}
}https://stackoverflow.com/questions/15890488
复制相似问题