touchesEnded偶尔不叫

时间:2012-03-10 07:08:21

标签: ios objective-c uiview touches

我在我的UIView中实现了以下事件处理程序:

- (id)initWithFrame:(CGRect)frame
{
    self = [super initWithFrame:frame];
    if (self) 
    {     
        self.multipleTouchEnabled = YES;
    }
    return self;
}

-(void)touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event
{
    NSArray* touchObjects = [[event allTouches] allObjects];
    for(int i=0; i<[touchObjects count]; i++) 
    {
        touch = (UITouch*)[touchObjects objectAtIndex:i];
        curPoint = [touch locationInView:self];
        NSLog([NSString stringWithFormat:@"begin = %f,%f",curPoint.x,curPoint.y]);
    }    
}

-(void)touchesEnded:(NSSet *)touches withEvent:(UIEvent *)event
{
    CGPoint curPoint;
    for (UITouch *touch in touches) 
    {
        curPoint = [touch locationInView:self];
        NSLog([NSString stringWithFormat:@"ended = %f,%f",curPoint.x,curPoint.y]);
    }
}

-(void)touchesMoved:(NSSet *)touches withEvent:(UIEvent *)event
{
     //logging touches
}

-(void)touchesCancelled:(NSSet *)touches withEvent:(UIEvent *)event
{
     //logging touches
}

问题是我偶尔不会收到“touchesEnded”(或触及取消)事件。我总是收到“touchesBegan”和“touchMoved”活动。

我已登录这些方法,所以我100%确定我偶尔没有收到我期待的“touchesEnded”(或touchesCancelled)事件。

启用了multiTouch。

有人知道为什么会这样吗?当我使用这些事件删除子视图时,我收到这些事件是非常重要的。

有解决方法吗?是否可以查询当前触摸的视图(或窗口)?

2 个答案:

答案 0 :(得分:0)

您的touchesBegan:withEvent:方法不正确。它说:

NSArray* touchObjects = [[event allTouches] allObjects];

问题是[event allTouches]返回所有触摸,而不仅仅是启动阶段的触摸。因此,当第一根手指触摸屏幕时,您将记录一条begin = %f,%f消息。然后,当第二根手指触摸屏幕时,您将记录两条 begin = %f,%f条消息,其中一条消息用于您之前看到的触摸。

您的touchesEnded:withEvent:方法正确枚举touches参数,该参数仅包含结束阶段的触摸。因此,对于双指触摸,您将记录三条“开始”消息,但只记录两条“已结束”消息。

我不知道有任何方法可以在触摸处理方法之外询问当前的触摸。

答案 1 :(得分:0)

您是否考虑过使用- (void)touchesCancelled:(NSSet *)touches withEvent:(UIEvent *)event