2010-11-16 13 views
11

Parece que todos los métodos de toque de un UIView solamente si son llamados los toques comenzaron dentro de los límites de ese punto de vista. ¿Hay alguna manera de que una vista responda a un usuario que ha tocado fuera de la vista, pero luego arrastra sus dedos hacia la vista?UIView, cómo determinar cuándo toques entró en la vista

En caso de que las cosas, mi aplicación específica es para arrastrar un MKPinAnnotationView (utilizando una función de arrastre 4.0). Quiero que algo suceda si el usuario arrastra un pin a otra vista (que pasa a ser también un AnnotationView, pero podría ser cualquier cosa). No se llama ningún método para arrastrar hasta que suelte el pin; y ningún método, no parece que se llame a la UIView que se está arrastrando, a menos que comience tocando desde dentro de la vista.

Debido a que el supervista es un MKMapView, que es difícil de usar sólo el caso de que touchesMoved y comprobar si el usuario está en el lugar correcto o no. ¡Gracias!

+0

@ Joe - una subclase de MKMapView no recibe touchesBegan o TouchesMoved ...Supongo que porque tiene que hacer sus propias cosas para desplazarse y hacer zoom. Ese problema se describe aquí: http://stackoverflow.com/questions/1049889/how-to-intercept-touches-events-on-a-mkmapview-or-uiwebview-objects – GendoIkari

Respuesta

3

Así que después de jugar con eso por un tiempo, encontré que la respuesta dada here en realidad me dio lo que necesitaba, a pesar de que la pregunta que se hacía era diferente.

Resulta que puede subclase UIGestureRecognizer; y hacer que maneje todos los toques para la vista a la que se ha agregado (incluido un MKMapView). Esto permite que todas las interacciones normales de MKMapView se comporten sin problemas; pero también me alerta de los toques. En touchesMoved, solo compruebo la ubicación del toque; y ver si está dentro de los límites de mi otro punto de vista.

De todo lo que probé; esta parece ser la única forma de interceptar toquesMovido mientras el usuario arrastra una MKAnnotación.

0

Cada vista hereda UIResponder por lo que cada vista obtiene toques Bean/Moved/Ended - No creo que comenzar el toque fuera de la vista signifique que la vista no tenga ningún evento cuando el toque se desplace sobre la vista. Si desea recibir una notificación de que algo ha sido arrastrado a su MKMapView, debe crear una subclase que maneje el toque, pero luego pasa el evento al super, lo que permite que la jerarquía haga todo lo que necesite con el toque. No necesita capturar o modificar el evento, simplemente obsérvelo.

+0

He confirmado con una simple vista de prueba que tocar fuera de una vista y arrastrando el dedo hacia adentro no hace que se toquen touchesBegan o touchesMoved. – GendoIkari

1

seguro que puede:

(HitstateView.h)

#import <UIKit/UIKit.h> 


@interface HitstateView : UIView { 
    id overrideObject; 
} 

@property (nonatomic, retain) id overrideObject; 

@end 

(HitstateView.m)

#import "HitstateView.h" 


@implementation HitstateView 

@synthesize overrideObject; 

- (void)dealloc { 
    self.overrideObject = nil; 

    [super dealloc]; 
} 

- (UIView *)hitTest:(CGPoint)point withEvent:(UIEvent *)event { 
    UIView *hitView = [super hitTest:point withEvent:event]; 
    if (hitView == self) { 
     return overrideObject; 
    } 
    return hitView; 
} 

@end 

Hacer este punto de vista del tamaño de su área de contacto. Establezca el overideObject en la vista que desea que vayan los toques. IIRC debe ser una subvista de HitstateView.

+1

Parece que hitTest solo se invoca cuando el usuario presiona el botón por primera vez; no se llama cuando el usuario se mueve/arrastra. – GendoIkari

0

Depende de cómo sus puntos de vista se establezcan. En general, aprovechar la cadena de respuesta es la mejor manera de hacerlo. Le permite jugar trucos, aunque puede ser demasiado específico para abordar sus necesidades particulares.

También puede jugar malas pasadas con los acontecimientos hacia adelante por anulación golpeó la prueba:

http://developer.apple.com/library/ios/#documentation/EventHandling/Conceptual/EventHandlingiPhoneOS/MultitouchEvents/MultitouchEvents.html%23//apple_ref/doc/uid/TP40009541-CH3-SW3

su caso particular suena bastante exótico, lo que puede tener para jugar trucos como tener una vista padre cuyo marco es lo suficientemente grande para contener ambas vistas en cuestión.

Cuestiones relacionadas