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