开发者

Detect Any touch Event across Application in iphone

My objective is to detect any touch event inside My Application on any view... (i.e Inside my application any touch event in anywhere should be detected...) I have tried it by subclassing my appDelegate Class with UIApplication but it is giving me error

how to detect idle user in iphone-sdk

开发者_开发问答how to resolve that error Or implement it in any other way...

Please Help

Thanks


OK, I've answered that linked question. However you may want to consider a different approach, which is using class_replaceMethod() to "swizzle" the UIView touch methods with your own implementation.


Here is a detector that tested ok on IOS 4 and 5. There is a caveat. If you are using gesture recognizers, you must set the global AppTouched to false when they get to state UIGestureRecognizerStateEnded.

#import <objc/runtime.h> 

Boolean AppTouched = false;     // provide a global for touch detection    

static IMP iosBeginTouch = nil; // avoid lookup every time through
static IMP iosEndedTouch = nil;
static IMP iosCanedTouch = nil;

// implement detectors for UIView
@implementation  UIView (touchesBeganDetector)
- (void)touchesBeganDetector:(NSSet *)touches withEvent:(UIEvent *)event
{
    AppTouched = true;

    if ( iosBeginTouch == nil )
        iosBeginTouch = [self methodForSelector:
                              @selector(touchesBeganDetector:withEvent:)];

    iosBeginTouch( self, @selector(touchesBegan:withEvent:), touches, event );
}
@end

@implementation  UIView (touchesEndedDetector)
- (void)touchesEndedDetector:(NSSet *)touches withEvent:(UIEvent *)event
{
    AppTouched = false;

    if ( iosEndedTouch == nil )
        iosEndedTouch = [self methodForSelector: 
                              @selector(touchesEndedDetector:withEvent:)];

    iosEndedTouch( self, @selector(touchesEnded:withEvent:), touches, event );
}
@end

@implementation  UIView (touchesCancledDetector)
- (void)touchesCancledDetector:(NSSet *)touches withEvent:(UIEvent *)event
{
    AppTouched = false;

    if ( iosCanedTouch == nil )
        iosCanedTouch = [self methodForSelector:     
                              @selector(touchesCancledDetector:withEvent:)];

    iosCanedTouch( self, @selector(touchesCancelled:withEvent:), touches, event );
}
@end

// http://stackoverflow.com/questions/1637604/method-swizzle-on-iphone-device
static void Swizzle(Class c, SEL orig, SEL repl )
{
    Method origMethod = class_getInstanceMethod(c, orig );
    Method newMethod  = class_getInstanceMethod(c, repl );

    if(class_addMethod( c, orig, method_getImplementation(newMethod),
                                 method_getTypeEncoding(newMethod)) )

        class_replaceMethod( c, repl, method_getImplementation(origMethod), 
                                      method_getTypeEncoding(origMethod) );
    else
        method_exchangeImplementations( origMethod, newMethod );
}

@interface  touchDetector : NSObject {}
- (id) init;
@end

@implementation touchDetector

- (id) init
{
     if ( ! [ super init ] )
         return nil;

    SEL rep = @selector( touchesBeganDetector:withEvent: );
    SEL orig = @selector( touchesBegan:withEvent: );
    Swizzle( [UIView class], orig, rep );

    rep = @selector( touchesEndedDetector:withEvent: );
    orig = @selector( touchesEnded:withEvent: );
    Swizzle( [UIView class], orig, rep );

    rep = @selector( touchesCancledDetector:withEvent: );
    orig = @selector( touchesCancelled:withEvent: );
    Swizzle( [UIView class], orig, rep );

    return self;
}
@end
0

上一篇:

下一篇:

精彩评论

暂无评论...
验证码 换一张
取 消

最新问答

问答排行榜