2010-07-12 6 views
2

Comment puis-je afficher un DisclosureButton dans la légende userLocation (le point bleu) comme le fait l'application Apple Maps?Comment ajouter une légende Button to userLocation?

Maintenant, je peux juste changer son titre et sous-titre, mais j'espère fournir des vues personnalisées. Par conséquent, si je clique sur le point bleu, il peut afficher un bouton en plus du titre et du sous-titre. De cette façon, lorsque je clique sur le bouton, il peut me guider vers une autre vue. J'ai retourné MKAnnotationView dans viewForAnnotation lors de l'annotation == self.mapView.userLocation. Cependant, la légende peut afficher le titre et le sous-titre mis à jour, mais ne peut pas afficher le bouton que j'ai ajouté.

J'ai vraiment besoin de cette fonction, et je désire toute aide et suggestion!

Répondre

2

Pour le annotationView, définissez

myAnnotationView.canShowCallout=YES; 

puis ajouter jusqu'à deux boutons avec

myAnnotationView.leftCalloutAccessoryView=myLeftButton; 

myAnnotationView.rightCalloutAccessoryView=myRightButton; 

Les boutons peuvent être un bouton normal, un bouton personnalisé, ou l'un des types prédéfinis. Comme ceci:

myAnnotationView.rightCalloutAccessoryView=[UIButton buttonWithType:UIButtonTypeDetailDisclosure]; 

ajouter ensuite la méthode calloutAccessoryControlTapped: pour gérer les robinets.

+0

Merci Henrik, je suis à la recherche de cette solution depuis des heures. – daidai

+2

Comment avez-vous pu gérer la vue d'annotation de MKUserLocation? – mjisrawi

+0

@mjisrawi vous l'obtenez dans - (MKAnnotationView *) mapView: (MKMapView *) mapView viewForAnnotation: (CarAnnotation *) annotation. Vous devez vérifier si l'annotation est le point bleu comme suit: if ([annotation isKindOfClass: [classe MKUserLocation]]) –

1

peut-être en retard. Voici la solution. Vous mettez en oeuvre la méthode UIMapViewDelegete comme ci-dessous:

- (void)mapView:(MKMapView *)mapView didSelectAnnotationView:(MKAnnotationView *)view { 
    if ([view.annotation isKindOfClass:[MKUserLocation class]] && !view.rightCalloutAccessoryView) { 
     view.rightCalloutAccessoryView = [UIButton buttonWithType:UIButtonTypeDetailDisclosure]; 

    } 
} 
+0

Si vous ajoutez le bouton chaque fois que vous sélectionnez la vue d'annotation, cela ne représente-t-il pas une surcharge? En outre, vous voyez le bouton accessoire apparaître légèrement après la vue d'annotation. Y a-t-il un moyen d'empêcher cela de se produire? – jowie

+0

- à propos du problème de surcharge, il y a une vérification de l'existant de accessoryView dans la clause 'if', ou vous pouvez utiliser la technique NSAutoreleasePool pour le résoudre. Placez l'instruction 'NSAutorelease * pool = [[NSAutorelease alloc] init];' à la première ligne de la fonction, et '[pool release]' à la dernière ligne de la fonction - à propos de l'animation, il n'y a aucun moyen de résoudre –

10

J'ai essayé solution de camdaochemgio, mais il ne fonctionne que pour le second robinet. Voici une solution qui fonctionnera toujours:

-(void)mapView:(MKMapView *)mapView didAddAnnotationViews:(NSArray *)views 
{ 
    for (MKAnnotationView* view in views) 
    { 
     if ([view.annotation isKindOfClass:[MKUserLocation class]]) 
     { 
      view.rightCalloutAccessoryView=[UIButton buttonWithType:UIButtonTypeDetailDisclosure]; 
     } 
    } 
} 
Questions connexes