2010-08-12 7 views
9

tengo una MKOverlayView personalizada en mi mapa y me gustaría detectar toques. Sin embargo, parece que no puedo obtener la superposición para responder. Tenía la esperanza de que iba a ser algo tan tonto como olvidarse de fijar userInteractionEnabled a sí ... pero por desgracia, no hay suerteMKOverlayView y toques

.... Actualmente, aquí es cómo lo tengo:

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

} 

mi clase de plantilla personalizada simplemente implementa touchesBegan, y se extiende MKCircleView

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

Respuesta

12

en primer lugar, añadir un reconocedor gesto a su MKMapView (nota: esto es suponiendo ARC):

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

En la acción reconocedor, se puede averiguar si el punto de grifo estaba en una vista a través de algo como lo siguiente:

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

gracias por una respuesta tan clara que funcionó a la perfección –

Cuestiones relacionadas