绘画应用程序中的 UISwipeGestureRecognizer
Posted
技术标签:
【中文标题】绘画应用程序中的 UISwipeGestureRecognizer【英文标题】:UISwipeGestureRecognizer in painting app 【发布时间】:2011-10-06 14:49:27 【问题描述】:我正在开发一个简单的笔记/绘画应用程序。我有一个像纸/画布一样工作的视图控制器。在其中我想实现 UISwipeGestureRecognizer,例如,当用户快速想要显示菜单时,他或她可以向上滑动而不是点击我的“编辑”按钮,或者当他/她想要换纸时向左或向右滑动/注意。
问题是,当用户(用两根手指)滑动时,应用程序也会在同一方向上画一条短线。
我已经像这样实现了 UISwipeGestureRecognizer:
UISwipeGestureRecognizer *recognizer;
recognizer = [[UISwipeGestureRecognizer alloc] initWithTarget:self
action:@selector(handleSwipeFrom:)];
[recognizer setDirection:(UISwipeGestureRecognizerDirectionUp)];
recognizer.numberOfTouchesRequired = 2;
[[self view] addGestureRecognizer:recognizer];
[recognizer release];
// Delegate method
- (BOOL)gestureRecognizer:(UIGestureRecognizer *)gestureRecognizer shouldReceiveTouch:(UITouch *)touch
return YES;
// Helper method for handeling swipes
-(void)handleSwipeFrom:(UISwipeGestureRecognizer *)recognizer
if (recognizer.direction == UISwipeGestureRecognizerDirectionUp)
[self enableEditingMode];
绘画机制在同一个控制器的以下方法中处理:
- (void)touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event
- (void)touchesMoved:(NSSet *)touches withEvent:(UIEvent *)event
- (void)touchesEnded:(NSSet *)touches withEvent:(UIEvent *)event
上面的三个方法似乎在我的 UIGestureRecognizer 之前被调用。我试图制作一个 BOOL 变量,如果布尔变量为 YES,则禁用绘画代码。但这没有用。关于如何解决这个问题的任何其他想法都会很棒!
注意:我正在模拟器中进行滑动测试。也许这会影响它?
【问题讨论】:
【参考方案1】:你需要确保你也实现了
- (void)touchesCancelled:(NSSet *)touches withEvent:(UIEvent *)event;
你可以撤消触摸。
【讨论】:
嗨,谢谢。我对 ios 开发很陌生。你知道是否可以在 touchesCancelled 中使用 NSUndoManager 吗?我试过了,但我没有抓住它。还是有更好的方法?考虑在 1.1 中实现滑动功能,比我希望的要困难。 你是如何跟踪绘图的?【参考方案2】:在我看来,同时注册手势识别器和触摸*方法并不是一个好主意。他们必然会互相干扰。您应该只注册 touches* 方法,并确定它是否是滑动。如果是在必要方向上滑动,请勿绘制。
【讨论】:
您好,感谢您的回答。这是否意味着我必须实现自定义手势识别器?应该是一种更简单的方式,我希望我的手势表现得像在其他应用程序中一样。或者是否可以在我的触摸方法中使用“经典”手势识别器?此外,我尝试了 delaysTouchesBegan,但它使应用程序非常缓慢。 不是真正的自定义手势识别器,但检测简单的水平或垂直滑动实际上非常简单。看看dosomethinghere.com/2009/07/23/…,***.com/questions/2042930/…。我认为不可能在您的触摸方法中使用内置的手势识别器。 酷,稍后会检查。然而,在我快速浏览时,我找不到任何关于两次手指滑动的信息。 tapCount 只检测点击,是否有对应的 numberOfTouchesRequired = 2 (UIGestureRecognizer 方法)我可以在我的触摸方法中使用?还是有另一种方法来检测两次手指滑动?谢谢。【参考方案3】:我可能已经让它工作了。虽然只在模拟器中对其进行了测试,但不确定它是否可以在设备上运行,因为模拟器会立即识别两个手指触摸。解决方案如下所示(截至http://www.iphonedevsdk.com/forum/iphone-sdk-development/23537-implemented-touchesbegan-only-giving-me-one-touch.html):
- (void)touchesMoved:(NSSet *)touches withEvent:(UIEvent *)event
NSSet *allTouches = [touches setByAddingObjectsFromSet:[event allTouches]];
if (allTouches.count== 1)
if (isUsingPen)
[self painting:touches];
if (isUsingEraser)
[self erasing:touches];
我会通知这是否也适用于设备,或者有其他人在设备上尝试过这种方法吗?
【讨论】:
我现在也在 iPod touch 上对其进行了测试,这个解决方案运行良好。以上是关于绘画应用程序中的 UISwipeGestureRecognizer的主要内容,如果未能解决你的问题,请参考以下文章