2010-08-12 3 views
9

J'ai un MKOverlayView personnalisé sur ma carte et je voudrais détecter les touches. Cependant, je n'arrive pas à obtenir la superposition pour répondre. J'espérais que ça allait être quelque chose d'aussi stupide que l'oubli de mettre userInteractionEnabled OUI ... mais hélas, pas de chance, ilMKOverlayView et touche

.... 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 classe personnalisée overlay implémente simplement touchesBegan et étend MKCircleView

-(void)touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event 
{ 
    NSLog(@"touch!"); 
} 

Répondre

12

Tout d'abord, ajouter un geste de reconnaissance à votre MKMapView (note: ceci suppose ARC):

[myMapView addGestureRecognizer:[[UITapGestureRecognizer alloc] initWithTarget:self action:@selector(mapTapped:)]]; 

Dans l'action de reconnaissance, vous pouvez comprendre si le point du robinet était vue par quelque chose comme ce qui suit:

- (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]); 
} 
+0

merci pour une réponse aussi claire qui a fonctionné parfaitement –

Questions connexes