绘画应用程序中的 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的主要内容,如果未能解决你的问题,请参考以下文章

PyQt 5.7 中 GraphicsView 中的奇怪绘画错误

该如何认识ZBrush中的2.5D绘画

在 Qt 小部件中的视频顶部绘画

在JFrame中绘画

如何在网格上绘画UE4

我无法在 QOpenGLWidget 上绘画