2010-08-12 4 views
9

Ich habe eine benutzerdefinierte MKOverlayView auf meiner Karte und ich möchte Berührungen erkennen. Allerdings kann ich nicht das Overlay erhalten, um zu antworten. Ich hatte gehofft, es würde etwas so dumm wie vergessen sein userInteractionEnabled auf YES zu setzen ... aber leider kein Glück dortMKOverlayView und berührt

.... zur Zeit, hier ist, wie ich es haben:

//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; 

} 

meine benutzerdefinierte Overlay-Klasse einfach implementiert touchesBegan und erstreckt sich MKCircleView

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

Antwort

12

Erstens eine Geste Erkenner zu Ihrem MKMapView hinzufügen (Hinweis: diese ARC wird vorausgesetzt):

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

In der Erkennungs Aktion können Sie herausfinden, ob der Hahn Punkt über etwa wie folgt in einer Ansicht war:

- (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

danken Ihnen für eine solche klare Antwort, die perfekt gearbeitet –