Обнаружение любого сенсорного события через приложение в iphone - PullRequest
0 голосов
/ 24 июня 2010

Моя цель состоит в том, чтобы обнаружить любое событие касания в Моем приложении в любом представлении ... (т.е. внутри моего приложения должно быть обнаружено любое событие касания в любом месте ...) Я попробовал его, подклассифицировав класс appDelegate с помощью UIApplication, новыдает мне ошибку

как обнаружить незанятого пользователя в iphone-sdk

как устранить эту ошибку или реализовать ее любым другим способом ...

Пожалуйста, помогите

Спасибо

Ответы [ 2 ]

1 голос
/ 24 июня 2010

ОК, я ответил на этот связанный вопрос.Однако, возможно, вы захотите рассмотреть другой подход, который использует class_replaceMethod() для "быстрого" применения сенсорных методов UIView с вашей собственной реализацией.

0 голосов
/ 24 июня 2012

Вот детектор, который нормально работал на IOS 4 и 5. Есть предостережение.Если вы используете распознаватели жестов, вы должны установить глобальное значение AppTouched в false, когда они получат состояние 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

// /1172580/metod-swizzle-na-ustroistve-iphone
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
...