iPhone: Detecção Tap em MKMapView
-
16-09-2019 - |
Pergunta
Como faço para detectar um único toque em uma instância do MKMapView
? Eu tenho que MKMapView
subclasse e, em seguida, substituir o método touchesEnded
?
Obrigado,
-Chris
Solução
Esperamos que isto ajude: Como interceptar toques eventos em um MKMapView ou UIWebView objetos?
Outras dicas
Se você está olhando apenas para ser notificado da TAP gestos sem afetar qualquer outro comportamento toque do mapa, você vai querer usar um UITapGestureRecognizer
. É super simples, basta colocar em algum código como este.
UITapGestureRecognizer* tapRec = [[UITapGestureRecognizer alloc]
initWithTarget:self action:@selector(didTapMap:)];
[theMKMapView addGestureRecognizer:tapRec];
[tapRec release];
Isso vai chamar a didTapMap
sempre theMKMapView
recebe um gesto de tocar e todos os beliscar e, arrastando gestos continuará a funcionar como antes.
funcionando perfeitamente no 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 ...
}
Ou, dependendo do que você está tentando fazer, adicionar um MKAnnotation
(alfinete, com um texto explicativo), então você tem algo a torneira -. E, em seguida, seu mapa delegado receberá um evento eg
mapView:(MKMapView *)mapView annotationView:(MKAnnotationView *)view calloutAccessoryControlTapped:(UIControl *)control
Você não pode neste momento toques de interceptação em uma visualização do mapa, você pode tentar mergulhar uma visão opaca lá e ver se ele pega toques ...
Basta adicionar algum trecho de código como ilustração de resposta @ tt-kilew. No meu caso, eu quero apontar o usuário para si no mapa, mas não quero interromper seu toque arrasto.
@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
Nada que eu já encontrado funcionou, mas eu vim com essa solução unperfect: Na viewDidLoad
let singleTapRecognizer = UITapGestureRecognizer(target: self, action: #selector(onMapClicked))
singleTapRecognizer.delegate = self
mapView.addGestureRecognizer(singleTapRecognizer)
Em delegado:
func gestureRecognizer(_ gestureRecognizer: UIGestureRecognizer, shouldReceive touch: UITouch) -> Bool {
return touch.view!.frame.equalTo(mapView.frame)
}