Créer une superposition à partir de l'interaction de l'user sur MKMapView?

J'ai deux questions,

  1. Comment créer une superposition sur un MKMapkitView à partir des events de contact de l'user? Par exemple, pour restr simple, l'user touche et crée une superposition MKCircle

  2. Comment l'application Cartes implémente-t-elle la "broche déposée" au toucher? Quelqu'un sait ou a des exemples de code sur la façon d'accomplir quelque chose de similaire?

Tout pointeur serait grandement apprécié. J'ai été googling et lu beaucoup de docs sans beaucoup de succès comme vous pouvez le voir.

Voici un exemple qui crée un cercle et laisse tomber une épingle où l'user touche et tient son doigt pendant 1 seconde. Il utilise un UILongPressGestureRecognizer qui est ajouté à mapView chaque fois que la carte est initialisée (par exemple viewDidLoad).

Assurez-vous que le délégué de mapView est également défini.

// In viewDidLoad or where map is initialized... UILongPressGestureRecognizer *lpgr = [[UILongPressGestureRecognizer alloc] initWithTarget:self action:@selector(handleLongPress:)]; lpgr.minimumPressDuration = 1.0; //user must hold for 1 second [mapView addGestureRecognizer:lpgr]; [lpgr release]; ... - (void)handleLongPress:(UIGestureRecognizer *)gestureRecognizer { if (gestureRecognizer.state != UIGestureRecognizerStateBegan) return; CGPoint touchPoint = [gestureRecognizer locationInView:mapView]; CLLocationCoordinate2D touchMapCoordinate = [mapView convertPoint:touchPoint toCoordinateFromView:mapView]; //add pin where user touched down... MKPointAnnotation *pa = [[MKPointAnnotation alloc] init]; pa.coordinate = touchMapCoordinate; pa.title = @"Hello"; [mapView addAnnotation:pa]; [pa release]; //add circle with 5km radius where user touched down... MKCircle *circle = [MKCircle circleWithCenterCoordinate:touchMapCoordinate radius:5000]; [mapView addOverlay:circle]; } -(MKOverlayView *)mapView:(MKMapView *)mapView viewForOverlay:(id)overlay { MKCircleView* circleView = [[[MKCircleView alloc] initWithOverlay:overlay] autorelease]; circleView.fillColor = [UIColor redColor]; return circleView; } - (MKAnnotationView *)mapView:(MKMapView *)mapView viewForAnnotation:(id <MKAnnotation>)annotation { static NSSsortingng *AnnotationIdentifier = @"Annotation"; MKPinAnnotationView* pinView = (MKPinAnnotationView *)[mapView dequeueReusableAnnotationViewWithIdentifier:AnnotationIdentifier]; if (!pinView) { pinView = [[[MKPinAnnotationView alloc] initWithAnnotation:annotation reuseIdentifier:AnnotationIdentifier] autorelease]; pinView.pinColor = MKPinAnnotationColorGreen; pinView.animatesDrop = YES; } else { pinView.annotation = annotation; } return pinView; }