Je travaille actuellement avec le mapkit et je suis bloqué.
J'utilise une vue d'annotation personnalisée et je souhaite utiliser la propriété image pour afficher le point sur la carte avec ma propre icône. J'ai cela fonctionne bien. Mais ce que j'aimerais aussi faire est de remplacer la vue de légende par défaut (la bulle qui apparaît avec le titre / sous-titre lorsque l'icône d'annotation est touchée). Je veux pouvoir contrôler la légende elle-même: le mapkit ne donne accès qu'aux vues de légende auxiliaires gauche et droite, mais aucun moyen de fournir une vue personnalisée pour la bulle de légende, ou de lui donner une taille nulle, ou quoi que ce soit d'autre.
Mon idée était de remplacer selectAnnotation / déselectAnnotation dans my MKMapViewDelegate
, puis de dessiner ma propre vue personnalisée en appelant ma vue d'annotation personnalisée. Cela fonctionne, mais uniquement lorsque canShowCallout
est défini sur YES
dans ma classe de vue d'annotation personnalisée. Ces méthodes ne sont PAS appelées si ce paramètre est défini sur NO
(ce que je veux, pour que la bulle de légende par défaut ne soit pas dessinée). Je n'ai donc aucun moyen de savoir si l'utilisateur a touché mon point sur la carte (l'a sélectionné) ou a touché un point qui ne fait pas partie de mes vues d'annotation (l'a supprimé) sans que la vue de bulle de légende par défaut apparaisse.
J'ai essayé de suivre un chemin différent et de gérer moi-même tous les événements tactiles dans la carte, et je n'arrive pas à faire fonctionner cela. J'ai lu d'autres articles liés à la capture d'événements tactiles dans la vue de la carte, mais ils ne sont pas exactement ce que je veux. Existe-t-il un moyen de creuser dans la vue de la carte pour supprimer la bulle de légende avant de dessiner? Je suis à perte.
Aucune suggestion? Est-ce que je rate quelque chose d'évident?
Réponses:
Il existe une solution encore plus simple.
Créez une personnalisation
UIView
(pour votre légende).Créez ensuite une sous-classe de
MKAnnotationView
et remplacezsetSelected
comme suit:Boom, travail fait.
la source
detailCalloutAccessoryView
Autrefois, c'était pénible , mais Apple l'a résolu, il suffit de consulter la documentation sur MKAnnotationView
Vraiment, c'est ça. Prend n'importe quel UIView.
la source
Dans la continuité de la réponse brillamment simple de @ TappCandy, si vous souhaitez animer votre bulle de la même manière que celle par défaut, j'ai produit cette méthode d'animation:
Cela semble assez compliqué, mais tant que le point de votre bulle de légende est conçu pour être au centre, vous devriez simplement pouvoir le remplacer
myBubbleWidth
etmyBubbleHeight
avec votre propre taille pour que cela fonctionne. Et n'oubliez pas de vous assurer que vos sous-vues ont leurautoResizeMask
propriété définie sur 63 (c'est-à-dire "toutes") afin qu'elles soient correctement mises à l'échelle dans l'animation.: -Joe
la source
CABasicAnimation
... Il y a trop longtemps pour m'en souvenir! Je sais que je devrais également animer la propriété y, en raison du décalage central.CGRectMake
?J'ai trouvé que c'était la meilleure solution pour moi. Vous devrez faire preuve de créativité pour faire vos propres personnalisations
Dans votre
MKAnnotationView
sous-classe, vous pouvez utiliserEt si le
subview
est unUICalloutView
, alors vous pouvez visser avec, et ce qu'il y a à l'intérieur.la source
if ([[[subview class] description] isEqualToString:@"UICalloutView"])
Je pense qu'il existe un meilleur moyen, mais cela fonctionne.J'ai eu le même problème. Il existe de nombreux articles de blog sur ce sujet sur ce blog http://spitzkoff.com/craig/?p=81 .
Le simple fait d'utiliser le
MKMapViewDelegate
ne vous aide pas ici et le sous-classementMKMapView
et essayer d'étendre la fonctionnalité existante ne fonctionnait pas non plus pour moi.Ce que j'ai fini par faire, c'est créer le mien
CustomCalloutView
que j'ai en plus du mienMKMapView
. Vous pouvez personnaliser cette vue comme vous le souhaitez.My
CustomCalloutView
a une méthode similaire à celle-ci:Il prend un
MKAnnotation
objet et définit son propre titre, puis il appelle deux autres méthodes assez laides qui ajustent la largeur et la taille du contenu de la légende, puis dessinent la bulle autour de lui à la bonne position.Enfin, la vue est ajoutée en tant que sous-vue à la mapView. Le problème avec cette solution est qu'il est difficile de conserver la légende à la bonne position lorsque la vue de la carte défile. Je cache simplement la légende dans la méthode de délégué des vues de carte sur un changement de région pour résoudre ce problème.
Il a fallu du temps pour résoudre tous ces problèmes, mais maintenant, la légende se comporte presque comme la légende officielle, mais je l'ai dans mon propre style.
la source
Fondamentalement, pour résoudre ce problème, il faut: a) Empêcher l'apparition de la bulle de légende par défaut. b) Identifiez l'annotation sur laquelle vous avez cliqué.
J'ai pu y parvenir en: a) définissant canShowCallout sur NO b) en sous-classant, MKPinAnnotationView et en remplaçant les méthodes touchesBegan et touchesEnd.
Remarque: vous devez gérer les événements tactiles pour MKAnnotationView et non MKMapView
la source
Je viens de proposer une approche, l'idée ici est
Ici - testview est
UIView
de taille 320x100 - showCallout est BOOL -[self animateIn];
est la fonction qui permet de visualiser l'animation commeUIAlertView
.la source
Vous pouvez utiliser leftCalloutView, en définissant annotation.text sur @ ""
Veuillez trouver ci-dessous l'exemple de code:
la source
J'ai sorti ma fourchette de l'excellent SMCalloutView qui résout le problème en fournissant une vue personnalisée pour les légendes et en permettant des largeurs / hauteurs flexibles assez facilement. Encore quelques bizarreries à résoudre, mais c'est assez fonctionnel jusqu'à présent:
https://github.com/u10int/calloutview
la source