作为一种快捷方式(根本不需要)我在我的视图中有一个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);
}
}
}
如果我慢慢拖动,变量的值会相对较快地爬升,但是如果我将手指快速地向上滑动屏幕,它几乎不会调整值。我希望与此完全相反;慢速运动允许精细控制,而快速运动允许更快的变化。
我将如何实现这一目标?它不能很好地工作。
答案 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);
}
}