Listen to all touch events in an iOS app
A subclass of UIWindow
could be used to do this, by overriding hitTest:
. Then in the XIB of your main window, there is an object usually simply called Window
. Click that, then on the right in the Utilities pane go to the Identities (Alt-Command-3). In the Class text field, enter the name of your UIWindow
subclass.
MyWindow.h
@interface MyWindow : UIWindow
@end
MyWindow.m
@implementation MyWindow
- (UIView *)hitTest:(CGPoint)point withEvent:(UIEvent *)event
{
UIView *res;
res = [super hitTest:point withEvent:event];
// Setup/reset your timer or whatever your want to do.
// This method will be called for every touch down,
// but not for subsequent events like swiping/dragging.
// Still, might be good enough if you want to measure
// in minutes.
return res;
}
@end
You need a subclass of UIApplication
(let's call it MyApplication
).
You modify your main.m
to use it:
return UIApplicationMain(argc, argv, @"MyApplication", @"MyApplicationDelegate");
And you override the method [MyApplication sendEvent:]
:
- (void)sendEvent:(UIEvent*)event {
//handle the event (you will probably just reset a timer)
[super sendEvent:event];
}
You can use a tap gesture recognizer for this. Subclass UITapGestureRecognizer
and import <UIKit/UIGestureRecognizerSubclass.h>
. This defines touchesBegan:
, touchesMoved:
, touchesEnded:
and touchesCancelled:
. Put your touch-handling code in the appropriate methods.
Instantiate the gesture recognizer in application:didFinishLaunchingWithOptions:
and add it to UIWindow
. Set cancelsTouchesInView
to NO
and it'll pass all touches through transparently.
Credit: this post.