2011-05-11 94 views
3

我认为允许用户进行手指绘画。如果用一个手指触摸该区域,代码工作正常。例如:我用一根手指触摸并移动手指。然后,当我移动第一根手指时画出一条线。如果我用第二根手指触摸相同的视图,那么第一根手指画出的线会停止。iPhone - 忽略某个区域的第二次触摸

我想忽略第一个触摸之外的任何触摸,即跟踪第一次触摸但忽略所有其他触摸。

我正在使用touchesBegan /移动/结束。

我已经使用这个来检测触摸

UITouch *touch = [[event allTouches] anyObject]; 
lastPoint = [touch locationInView:myView]; 

我也试过这种

lastPoint = [[touches anyObject] locationInView:myView]; 

,但什么都没有改变。

我该怎么做 - 跟踪第一次触摸并忽略对视图的任何后续触摸?

谢谢。

注意:视图不会被调整为检测多个触摸。

+0

不会'yourView.multipleTouchEnabled = NO;'显然没有足够的 – visakh7 2011-05-11 18:35:13

+0

。我有multipleTouchEnabled = NO,问题仍然存在... – SpaceDog 2011-05-11 19:30:51

回答

3

只要与屏幕接触,给定的触摸将保持相同的存储地址。这意味着您可以将地址保存为实例变量并忽略来自其他对象的任何事件。但是,请不要保持触摸。如果你这样做,将使用不同的地址,你的代码将无法工作。

例子:

添加currentTouch到您的接口:

@interface MyView : UIView { 
    UITouch *currentTouch; 
    ... 
} 
... 
@end 

修改touchesBegan:忽视了联系,如果一个已经被跟踪:

- (void)touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event { 
    if(currentTouch) return; 
    currentTouch = [touches anyObject]; 
    ... 
} 

修改touchesMoved:使用currentTouch代替从该集合中获得触摸:

- (void)touchesMoved:(NSSet *)touches withEvent:(UIEvent *)event { 
    if(!currentTouch) return; 
    CGPoint currentPoint = [currentTouch locationInView:myView]; 
    ... 
} 

修改touchesEnded:touchesCancelled:清除currentTouch,但只有当currentTouch已经结束或者被取消。

- (void)touchesEnded:(NSSet *)touches withEvent:(UIEvent *)event { 
    if(currentTouch && currentTouch.phase == UITouchPhaseEnded) { 
     ... 
     currentTouch = nil; 
    } 
} 
- (void)touchesCancelled:(NSSet *)touches withEvent:(UIEvent *)event { 
    if(currentTouch && currentTouch.phase == UITouchPhaseCancelled) { 
     ... 
     currentTouch = nil; 
    } 
} 
+0

就是这样!!!!!!谢谢。使用这种方法,我解决了两个问题:这个问题提到的问题和当我触摸视图并开始绘制时发生的滞后。现在绘图部分很快并且忽略了超出第一部分的任何接触。唯一的小故障是,当我触摸第二根手指时,第一根手指停止绘制。 – SpaceDog 2011-05-12 13:09:57

0
yourView.multipleTouchEnabled = NO; 

reference documents on UIView

multipleTouchEnabled

一个布尔值,指示接收器是否 处理多触摸 事件。

@属性(非原子,吸气剂= isMultipleTouchEnabled)BOOL multipleTouchEnabled讨论

当设置为YES,接收机接收 与多点触摸 序列相关联的所有触摸。当设置为NO时,接收器仅通过多点触控序列接收到第一个触摸事件 。 此属性的默认值是 编号。

当这个 属性为NO时,同一窗口中的其他视图仍可以接收触摸事件。如果您希望此视图 专门处理多点触控事件 ,请将此属性的 和属性的exclusiveTouch 属性的值都设置为YES。

+0

谢谢,但我有multipleTouchEnabled = NO,问题仍在发生。 – SpaceDog 2011-05-11 19:27:27