我在我的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。
有人知道为什么会这样吗?当我使用这些事件删除子视图时,我收到这些事件是非常重要的。
有解决方法吗?是否可以查询当前触摸的视图(或窗口)?
答案 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
?