绘画应用程序中的UISwipeGestureRecognizer

时间:2011-10-06 14:49:27

标签: iphone objective-c ios

我正在制作一个简单的笔记/绘画应用程序。我有一个像纸/画布一样工作的视图控制器。在其中我想实现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,则禁用绘制代码。但这没效果。关于如何解决这个问题的任何其他想法都会很棒!

注意:我正在模拟器中进行滑动测试。也许会影响到它?

3 个答案:

答案 0 :(得分:1)

您需要确保同时实施

- (void)touchesCancelled:(NSSet *)touches withEvent:(UIEvent *)event;

然后您可以撤消触摸。

答案 1 :(得分:0)

在我看来,注册手势识别器和放大器。触摸*方法不是一个好主意。他们必然会相互干涉。您应该只注册touches *方法,并确定它是否是滑动。如果是在必要方向上滑动,请不要画画。

答案 2 :(得分:-1)

我可能已经开始工作了。虽然只是在模拟器中进行了测试,但不确定它是否可以在设备上运行,因为模拟器会立即识别出两个手指触摸。解决方案看起来像这样(从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];
        }  
    }
}

如果这也适用于某个设备,或者还有其他人在设备上尝试过此方法,我会通知我吗?