ios mapkit fermant les annotations d'annotation en appuyant sur la carte

J'ai une application mapkit qui place des annotations sur la carte, lorsque vous appuyez dessus, elle affiche la légende avec l'atsortingbut title.

Cela fonctionne très bien, mais l'user ne peut pas les fermer. Ils restnt ouverts jusqu'à ce qu'ils tapent une autre annotation. Est-ce que je ne peux pas faire en sorte que l'user puisse taper elsehwere sur la carte (ou appuyer de nouveau sur l'annotation) pour le fermer?

J'ai eu l'printing que c'était le réglage par défaut, alors peut-être que je fais quelque chose de bourré? J'ai un système de reconnaissance de gestes que j'utilise pour détecter des robinets de carte

UITapGestureRecognizer *tap = [[UITapGestureRecognizer alloc] initWithTarget:self action:@selector(handleTap:)]; tap.numberOfTapsRequired = 1; [self.mapView addGestureRecognizer: tap]; 

qui tire ceci:

 - (void)handleTap:(UITapGestureRecognizer *)sender { if (sender.state == UIGestureRecognizerStateEnded) { CGPoint tapPoint = [sender locationInView:sender.view.superview]; CLLocationCoordinate2D coordinate = [self.mapView convertPoint: tapPoint toCoordinateFromView: self.mapView]; if (pitStopMode && !pitStopMade){ pitStopMade = YES; InfoAnnotation *annotation = [[InfoAnnotation alloc] initNewPitstopWithCoordinate:coordinate]; NSLog(@" Created Pit Stop"); annotation.draggable = NO; //place it on the map [self.mapView addAnnotation: annotation]; self.instructionLabel.text = @"Tap button again to remove"; annotation.creatorId = self.localUser.deviceId; //send it to the server [annotation updateLocationWithServerForConvoy: self.convoyCode]; [annotation release]; } if (hazardMode && !hazardMade){ hazardMade = YES; InfoAnnotation *annotation = [[InfoAnnotation alloc] initNewHazardWithCoordinate:coordinate]; NSLog(@" Created Hazard"); annotation.draggable = NO; //place it on the map [self.mapView addAnnotation: annotation]; self.instructionLabel.text = @"Tap button again to remove"; annotation.creatorId = self.localUser.deviceId; //send it to the server [annotation updateLocationWithServerForConvoy: self.convoyCode]; [annotation release]; } } 

}

Y a-t-il quelque chose que je dois faire pour que ces robinets passent aussi à la carte? Faire glisser et tapoter sur les annotations fonctionne bien, donc je ne suis pas sûr si c'est ce qui le cause?

Y at-il une option qui me manque, ou dois-je essayer de l'implémenter manuellement?

Vous pouvez implémenter la méthode gestureRecognizer:shouldRecognizeSimultaneouslyWithGestureRecognizer: et renvoyer YES (de sorte que le reconnaisseur de gestes de gestureRecognizer:shouldRecognizeSimultaneouslyWithGestureRecognizer: la vue de carte exécute également sa méthode).

Tout d'abord, ajoutez la déclaration de protocole à l'interface de votre controller de vue (pour éviter un avertissement du compilateur):

 @interface MyViewController : UIViewController <UIGestureRecognizerDelegate> 

Ensuite, définissez la propriété delegate sur le module de reconnaissance des gestes:

 tap.delegate = self; 

Enfin, implémentez la méthode:

 - (BOOL)gestureRecognizer:(UIGestureRecognizer *)gestureRecognizer shouldRecognizeSimultaneouslyWithGestureRecognizer: (UIGestureRecognizer *)otherGestureRecognizer { return YES; } 

Si cela ne fonctionne pas pour une raison quelconque, vous pouvez également désélectionner manuellement toute annotation sélectionnée en haut de la méthode handleTap: :

 for (id<MKAnnotation> ann in mapView.selectedAnnotations) { [mapView deselectAnnotation:ann animated:NO]; } 

Même si la vue de la carte permet uniquement de sélectionner au maximum une annotation à la fois, la propriété selectedAnnotations est un NSArray donc nous la NSArray boucle.

Anna explique bien.Aussi je veux expliquer avec exactement le code. Tu peux faire comme ça

  UITapGestureRecognizer *tapMap = [[UITapGestureRecognizer alloc] initWithTarget:self action:@selector(closeCallout:)]; [self.mapView addGestureRecognizer:tapMap]; -(void) closeCallout:(UIGestureRecognizer*) recognizer { for (id<MKAnnotation> ann in mapView.selectedAnnotations) { [mapView deselectAnnotation:ann animated:NO]; } }