35 votes

Comment puis-je afficher un UIPopoverView comme une annotation sur la carte? (iPad)

Sur l'application maps de l'IPad lorsque vous appuyez sur une broche, vous obtenez un normal annotation avec un "i" à la place d'une divulgation de l'indicateur. Un autre appuyez sur le "i" révèle une fenêtre pop-over-vue-contrôleur de ce genre.

map popover example

Est-il un moyen d'obtenir facilement ce?

58voto

Anna Points 44332

Tout d'abord ajouter une annotation à la carte et dans l' viewForAnnotation méthode, la valeur de l' rightCalloutAccessoryView à un bouton de type, disons, UIButtonTypeDetailDisclosure (je ne pense pas que le bleu de la touche info est disponible par défaut).

En appuyant sur le bouton d'appel de l' calloutAccessoryControlTapped délégué de la méthode. Dans cette méthode, désélectionnez l'annotation et de montrer à votre liste. Par exemple:

- (void)mapView:(MKMapView *)mapView annotationView:(MKAnnotationView *)view calloutAccessoryControlTapped:(UIControl *)control
{
    [mapView deselectAnnotation:view.annotation animated:YES];

    YourContentViewController *ycvc = [[YourContentViewController alloc] init...
    UIPopoverController *poc = [[UIPopoverController alloc] initWithContentViewController:ycvc];
    [ycvc release];

    //hold ref to popover in an ivar
    self.annotationPopoverController = poc;

    //size as needed
    poc.popoverContentSize = CGSizeMake(320, 400);

    //show the popover next to the annotation view (pin)
    [poc presentPopoverFromRect:view.bounds inView:view 
        permittedArrowDirections:UIPopoverArrowDirectionAny animated:YES];

    [poc release];
}

YourContentViewController est une sous-classe de UIViewController qui vous pouvez de code comme n'importe quel autre point de vue, contrôleur. L'application Maps ressemble à une UITableView dans le contenu.

2voto

Bejil Points 211

Il semble que, pour avoir une meilleure position pour la liste, vous devez le présenter à partir de ce rect:

CGPoint lc_point = [mapView convertCoordinate:view.annotation.coordinate toPointToView:mapView];
CGRect lc_frame = CGRectMake(lc_point.x,lc_point.y-view.frame.size.height,0,0);

2voto

nevan king Points 46410

Vous pouvez utiliser une bibliothèque comme Gordon Hughes' Animation de Légende. Malheureusement ça ne marche toujours pas parfaitement sur iOS 6 (légendes se montrer étrangement).

Voici iOS 5:

enter image description here

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X