2009-08-14 15 views

Respuesta

4
+0

Esto ayudó, pero tiene problemas. Pero es mejor que nada ... – bentford

+1

Sí, si lees en los comentarios hay otra solución. En realidad, hay una tercera forma de hacerlo (además de subclasificar MKMapView o superponer su propia vista en la parte superior y pasar los toques a MKMapView). En lugar de subclasificar MKMapView, subclase la ventana principal y pase los eventos táctiles tanto a MKMapView como a su vista. http://stackoverflow.com/questions/1121889/intercepting-hijacking-iphone-touch-events-for-mkmapview/1298330 No lo he probado todavía, pero aparentemente el rendimiento es mejor y pellizcar para hacer zoom todavía funciona. – ChrisJF

+0

este enlace ya no es válido –

1

Usted no puede en este momento toques de intercepción en una vista de mapa, se puede tratar de capas una vista opaca allí y ver si se recoge toques ...

2

O dependiendo de lo que esté intentando hacer, agregue un MKAnnotation (alfiler de empuje, con una leyenda), para que tenga algo para tocar, y luego su delegado de mapa recibirá un evento, por ej.

mapView:(MKMapView *)mapView annotationView:(MKAnnotationView *)view calloutAccessoryControlTapped:(UIControl *)control

30

Si usted está buscando para ser notificado de los gestos del grifo sin afectar a cualquiera de los otros comportamientos táctil del mapa, tendrá que utilizar una UITapGestureRecognizer. Es súper simple, solo coloca un código como este.

UITapGestureRecognizer* tapRec = [[UITapGestureRecognizer alloc] 
    initWithTarget:self action:@selector(didTapMap:)]; 
[theMKMapView addGestureRecognizer:tapRec]; 
[tapRec release]; 

que llamará al didTapMap cada vez que recibe un gesto theMKMapView grifo y todos los gestos de pellizco, y arrastrando seguirá funcionando como lo hacían antes.

+0

Para mí, configurar un selector no funcionó, pero funcionó al usar funciones de delegado (gestureRecognizerShouldBegin :) BTW, aunque el trabajo Tap and Pan, UIPinchGestureRecognizer no funciona, ni siquiera con las funciones de delegado. –

+0

No estoy seguro de qué decirle sin más detalles que eso ... Usar un selector siempre me funciona. – pseudopeach

+1

falta un punto, ir debe ser '@selector (didTapMap:)' – Ali

2

funcionando perfectamente en iOS 8

- (void)viewDidLoad 
    { 
     [super viewDidLoad]; 

     UITapGestureRecognizer *doubleTap = [[UITapGestureRecognizer alloc] initWithTarget:self action:nil]; 
     doubleTap.numberOfTapsRequired = 2; 
     doubleTap.numberOfTouchesRequired = 1; 
     [self.mapView addGestureRecognizer:doubleTap]; 

     UITapGestureRecognizer *singleTap = [[UITapGestureRecognizer alloc] initWithTarget:self action:@selector(handleGesture:)]; 
     singleTap.numberOfTapsRequired = 1; 
     singleTap.numberOfTouchesRequired = 1; 
     [singleTap requireGestureRecognizerToFail: doubleTap]; 
     [self.mapView addGestureRecognizer:singleTap]; 
    } 

    - (void)handleGesture:(UIGestureRecognizer *)gestureRecognizer 
    { 
      if (gestureRecognizer.state != UIGestureRecognizerStateEnded) 
       return; 
      //Do your work ... 
    } 
0

sólo tienes que añadir el fragmento de código como ejemplo de respuesta @ tt-kilew. En mi caso, quiero señalar al usuario a sí mismo en el mapa, pero no quiero interrumpir su toque de arrastre.

@interface PrettyViewController() <MKMapViewDelegate> 

@property (weak, nonatomic) IBOutlet MKMapView *mapView; 
@property (assign, nonatomic) BOOL userTouchTheMap; 

@end 

@implementation PrettyViewController 

#pragma mark - UIResponder 

- (void)touchesBegan:(NSSet<UITouch *> *)touches withEvent:(UIEvent *)event { 
    [super touchesBegan:touches withEvent:event]; 

    self.userTouchTheMap = [[touches anyObject].view isEqual:self.mapView]; 
} 


#pragma mark - MKMapViewDelegate 

- (void)mapView:(MKMapView *)mapView didUpdateUserLocation:(MKUserLocation *)userLocation { 
    //We just positioning to user 
    if (!self.userTouchTheMap) { 
     CLLocationDistance radius = 5000; 
     [self.mapView setRegion:MKCoordinateRegionMakeWithDistance(userLocation.location.coordinate, 2*radius, 2*radius) animated:YES]; 
    } 
} 

@end 
0

Nada de lo que se ha encontrado trabajados, pero se me ocurrió con esta solución unperfect: En viewDidLoad

let singleTapRecognizer = UITapGestureRecognizer(target: self, action: #selector(onMapClicked)) 
singleTapRecognizer.delegate = self 
mapView.addGestureRecognizer(singleTapRecognizer) 

En delegada:

func gestureRecognizer(_ gestureRecognizer: UIGestureRecognizer, shouldReceive touch: UITouch) -> Bool { 
    return touch.view!.frame.equalTo(mapView.frame) 
} 
Cuestiones relacionadas