When the user taps and holds down a UIButton in my app, after a while a UIControlEventTouchCancel event is fired. The Apple documentation for UIControl doesn't have any detailed explanation about this event. Why is it triggered? What is it used for?
[button addTarget:key action:@selector(keyUp:) forControlEvents:UIControlEventTouchUpInside];
[button addTarget:key action:@selector(keyUp:) forControlEvents:UIControlEventTouchUpOutside];
[button addTarget:key action:@selector(keyCancel:) forControlEvents:UIControlEventTouchCancel];
[button addTarget:key action:@selector(keyDown:) forControlEvents:UIControlEventTouchDown];
According to the documentation, a UIControlEventTouchCancel
event is due to:
A system event canceling the current touches for the control.
Therefore, it's not due to user input that the touch has ended, it's due to a system event (such as a low memory warning, or the app moving into the background). I have no idea why you are able to trigger it from simply pressing and holding on the button.
I'm pretty sure it's a similar (if not caused by the) event to the UIResponder
's touchesCancelled:withEvent:
event. The documentation on this is slightly more detailed:
This method is invoked when the Cocoa Touch framework receives a system interruption requiring cancellation of the touch event; for this, it generates a UITouch object with a phase of UITouchPhaseCancel. The interruption is something that might cause the application to be no longer active or the view to be removed from the window
One scenario is the screen rotation. If you rotate your screen while holding down the button you will get a touch cancel event.