J'ai un MKOverlayView personnalisé sur ma carte et je voudrais détecter les contacts. Cependant, je n'arrive pas à get la superposition pour répondre. J'espérais que ça allait être quelque chose d'aussi bête que d'oublier de mettre userInteractionEnabled à OUI … mais hélas, pas de chance là-bas
…. actuellement, voici comment je l'ai:
//map delegate overlay: - (MKOverlayView *)mapView:(MKMapView *)mapView viewForOverlay:(id <MKOverlay>)overlay { if (_radiusView !=nil) { [_radiusView removeFromSuperview]; [_radiusView release]; _radiusView = nil; } _radiusView = [[CustomRadiusView alloc]initWithCircle:overlay]; _radiusView.userInteractionEnabled = YES; _radiusView.strokeColor = [UIColor blueColor]; _radiusView.fillColor = [UIColor grayColor]; _radiusView.lineWidth = 1.0; _radiusView.alpha = 0; //fade in radius view [UIView beginAnimations:@"fadeInRadius" context:nil]; [UIView setAnimationCurve:UIViewAnimationCurveEaseInOut]; [UIView setAnimationDuration:0.6]; _radiusView.alpha = .3; [UIView commitAnimations]; return _radiusView; }
ma class de superposition personnalisée implémente simplement touchesBegan et étend MKCircleView
-(void)touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event { NSLog(@"touch!"); }
Tout d'abord, ajoutez un outil de reconnaissance de gestes à votre MKMapView (remarque: ceci suppose ARC):
[myMapView addGestureRecognizer:[[UITapGestureRecognizer alloc] initWithTarget:self action:@selector(mapTapped:)]];
Dans l'action de reconnaissance, vous pouvez déterminer si le sharepoint prise de vue était dans une vue via quelque chose comme:
- (void)mapTapped:(UITapGestureRecognizer *)recognizer { MKMapView *mapView = (MKMapView *)recognizer.view; id<MKOverlay> tappedOverlay = nil; for (id<MKOverlay> overlay in mapView.overlays) { MKOverlayView *view = [mapView viewForOverlay:overlay]; if (view) { // Get view frame rect in the mapView's coordinate system CGRect viewFrameInMapView = [view.superview convertRect:view.frame toView:mapView]; // Get touch point in the mapView's coordinate system CGPoint point = [recognizer locationInView:mapView]; // Check if the touch is within the view bounds if (CGRectContainsPoint(viewFrameInMapView, point)) { tappedOverlay = overlay; break; } } } NSLog(@"Tapped view: %@", [mapView viewForOverlay:tappedOverlay]); }