Cancel UITouch Events When View Covered By Modal UIViewController
- by kkrizka
Hi there,
I am writing an application where the user has to move some stuff on the screen using his fingers and drop them. To do this, I am using the touchesBegan,touchesEnded... function of each view that has to be moved.
The problem is that sometimes the views are covered by a view displayed using the [UIViewController presentModalViewController] function. As soon as that happens, the UIView that I was moving stops receiving the touch events, since it was covered up. But there is no event telling me that it stopped receiving the events, so I can reset the state of the moved view.
The following is an example that demonstrates this. The functions are part of a UIView that is being shown in the main window. It listens to touch events and when I drag the finger for some distance, it presents a modal view that covers everything. In the Run Log, it prints what touch events are received.
- (void)touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event {
NSLog(@"touchesBegan");
touchStart=[[touches anyObject] locationInView:self];
}
- (void)touchesMoved:(NSSet *)touches withEvent:(UIEvent *)event {
CGPoint touchAt=[[touches anyObject] locationInView:self];
float xx=(touchAt.x-touchStart.x)*(touchAt.x-touchStart.x);
float yy=(touchAt.y-touchStart.y)*(touchAt.y-touchStart.y);
float rr=xx+yy;
NSLog(@"touchesMoved %f",rr);
if(rr > 100) {
NSLog(@"Show modal");
[viewController presentModalViewController:[UIViewController new] animated:NO];
}
}
- (void)touchesEnded:(NSSet *)touches withEvent:(UIEvent *)event {
NSLog(@"touchesEnded");
}
- (void)touchesCancelled:(NSSet *)touches withEvent:(UIEvent *)event {
NSLog(@"touchesCancelled");
}
But when I test the application and trigger the modal dialog to be displayed, the following is the output in the Run Log.
[Session started at 2010-03-27
16:17:14 -0700.] 2010-03-27
16:17:18.831
modelTouchCancel[2594:207]
touchesBegan 2010-03-27 16:17:19.485
modelTouchCancel[2594:207]
touchesMoved 2.000000 2010-03-27
16:17:19.504
modelTouchCancel[2594:207]
touchesMoved 4.000000 2010-03-27
16:17:19.523
modelTouchCancel[2594:207]
touchesMoved 16.000000 2010-03-27
16:17:19.538
modelTouchCancel[2594:207]
touchesMoved 26.000000 2010-03-27
16:17:19.596
modelTouchCancel[2594:207]
touchesMoved 68.000000 2010-03-27
16:17:19.624
modelTouchCancel[2594:207]
touchesMoved 85.000000 2010-03-27
16:17:19.640
modelTouchCancel[2594:207]
touchesMoved 125.000000 2010-03-27
16:17:19.641
modelTouchCancel[2594:207] Show modal
Any suggestions on how to reset the state of a UIView when its touch events are interrupted by a modal view?