2009-10-07 20 views

Respuesta

10

Hay un práctico método catch-all en UIWindow llamado sendEvent: que ve todos los eventos cerca del inicio de la canalización de manejo de eventos. Si desea realizar un manejo de eventos adicionales no estándar, este es un buen lugar para ubicarlo. Algo como esto:

- (void)sendEvent:(UIEvent *)event { 
    if ([self eventIsNoteworthy:event]) [self extraEventHandling:event]; 
    [super sendEvent:event]; // Apple says you must always call this! 
} 

Docs: UIWindow class reference | iOS event delivery docs

This blog post también menciona cómo reemplazar hitTest:withEvent: de atrapar algunos eventos antes de que sean obligados a la subvista hoja de destino en la jerarquía de vistas. También puede anular ese método en su objeto UIWindow si lo desea.

3

UIWindow es una subclase de UIView, por lo que simplemente subclase y usarlo en ti AppDelegate:

self.window = [[MyWindow alloc] initWithFrame:CGRectMake(0,0,320,480)]; // Sorry for hard-coded frame size! 

y en MyWindow que anula -hitTest: withEvent: y/o -pointInside: withEvent:

0

UIWindow es una subclase de UIResponder, que tiene API para manejar eventos táctiles (por ejemplo, touchesBegan:withEvent:). Entonces, es posible subclasificar UIWindow, anular las API de manejo de eventos táctiles y administrar los eventos táctiles usted mismo.

+0

Si UIWindow tiene algunas subvistas similares a UITableView , último captura todos los eventos táctiles antes de que window tenga la oportunidad de manejarlos. Así touquesBegan: withEvent: grupo de métodos de ventana nunca se llama en estas circunstancias. En este caso, sendEvent: of UIWindow es la única forma de manejar eventos táctiles antes de que la vista de tabla los coma. –

4

Deberá tener la subclase UIWindow con su propia clase y anular el método sendEvent:. Pero recuerde que el método obtiene otros tipos de eventos: no solo toca, por lo que debe verificar el tipo de evento (event.type == UIEventTypeTouches). Además, dado que tienes un conjunto de toques, es posible que quieras comprobar cuáles acaban de comenzar, cuáles terminaron, movidos, etc. Para hacerlo, tienes que iterar a través de todos los Toque y verificar la propiedad de cada UITouch.

@implementation TouchWindow 

- (void)sendEvent:(UIEvent *)event { 

    if (event.type == UIEventTypeTouches) { 
     for(UITouch * t in [event allTouches]) { 
      if(t.phase == UITouchPhaseBegan) { 
       /* 
       Paste your code here. 
       Inform objects that some touch has occurred. 
       It's your choice if you want to perform method/selector directly, 
       use protocols/delegates, notification center or sth else. 
       */ 
      } 
     } 
    } 

    [super sendEvent:event]; 
} 

@end

Por supuesto TouchWindow es subclase de UIWindow

@interface TouchWindow : UIWindow 
@end 

y es probable que tenga que cambiar esa clase en el archivo de .xib en XCode

Cuestiones relacionadas