Comment définir l'ordre de chevauchement MKAnnotationViews?
J'ai plusieurs MKAnnotations (et leurs points de vue) dans ma carte, et il devient parfois vraiment bondé. Maintenant, les annotations dans mon application sont de deux sortes: certains sont liés à rester là où ils sont, tandis que d'autres vont se déplacer comme le temps passe. Je préfère avoir la plus stables visuellement dans le fond et le mouvement passe toujours devant eux.
On pourrait penser, peut-être, que les annotations les plus récemment ajoutés à la carte serait la fin jusqu'à la face avant (ou bien à l'arrière, au moins), mais ce ne semble pas être la règle. Aussi loin que je peux dire, j'ai créer et ajoutez TOUS les non-mouvement des annotations en premier, puis ajouter quelques nouvellement instancié déplacement des annotations, mais beaucoup d'entre eux (mais pas tous!) en fin de tracé sous les perpétuellement en stock-encore plus.
Fait intéressant, lorsque le temps passe, et pourtant, le nouveau mouvement annotations sont créés, ils ont tendance à graviter plus haut que le premier - et même si tous les objets d'annotation ont été créées après la ne bouge pièces ont déjà été ajoutées à la carte.
Que quelqu'un connait un truc pour modifier cette étrange ordre naturel des vues d'annotations sur la carte? J'ai essayé de rechercher sur la Carte Kit API, mais il ne semble pas parler d'une telle chose.
- J'ai aussi besoin d'une solution à ce problème. Avez-vous trouvé votre réponse?
- Nope, pas encore. Une question difficile.
Vous devez vous connecter pour publier un commentaire.
Ok, donc pour la solution d'utiliser la méthode de MKMapViewDelegate
Dans cette méthode, vous devez réorganiser les AnnotationView après avoir été ajouté à mapKit Vue.
Ainsi, le code peut ressemble à ceci:
Cela fonctionne pour moi.
AnnotationThatCanBeTopPlacedOrBottomPlaced
doit être placé en haut ou en basSous iOS 11 la mise en œuvre de
displayPriority
a battu tous les solutions qui utilisent lebringSubviewToFront
ouzPosition
.Si vous remplacez la vue d'annotation du CALayer, vous pouvez lutter contrôle de zPosition arrière de l'OS.
Essayer de configuration de la vue d'annotation de la couche zPosition (annotationView.la couche.zPosition) dans:
bringSubviewToFront:
n'a pas.Swift 3:
- Je obtenir de l'emplacement du trou à partir de l'API et j'ai eu des problèmes similaires, les broches qui devait être sur le dessus ne l'étaient pas. J'ai été en mesure de le résoudre comme ça.
Espère que cette aide
Je trouve que cette réorganisation de l'annotation de vue sur les causes de la légende qui s'affiche lorsque l'on clique dessus, de ne plus être au-dessus de toutes les annotations. J'ai même essayé de l'affinage, de sorte qu'au lieu de
bringSubviewToFront
etsendSubviewToBack
, j'utiliseinsertSubview:aboveSubview
etinsertSubview:belowSubview:
où le deuxième argument est la première annotationView dans la liste. Cela semble beaucoup moins de l'avant à l'arrière de la diffusion, mais les appels toujours pop up dans certaines annotations.Dans la fonction de délégué, vous pouvez sélectionner le code pin à force d'en-haut:
J'ai vraiment besoin de faire cela, et aucun des (actuelle) des réponses semble fournir un système fiable de mise en œuvre. En quelque sorte ils ont travaillé, mais panoramique de la carte, en choisissant les annotations, ou au zoom avant pourrait gâcher l'ordre nouveau.
La finale, bien comportés solution n'est pas si trivial, donc je vais juste décrire les étapes que j'ai pris ici. L'annotation de la commande que
MKMapView
utilise ne respecte pas l'ajout de l'ordre, ou même l'ordre d'un surchargéeannotations
de la propriété. Alors...Étapes
• Créer un
CADisplayLink
• Tous les cadres, à réorganiser les annotations à l'aide de les deux la couche zPosition, et la vue de la commande dans la superview de
subviews
tableau.• Si l'affichage est sélectionné, le promouvoir à l'avant dans votre commande de régime
• Appuyant sur les annotations respecte interne
MKMapView
de la commande, en dépit de la déjà fait des changements. Pour contrer cela, ajoutez unMKMapViewDelegate
• le délégué de l'objet
mapView:didSelect:
méthode, vérifier si l'annotation sélectionnée est ce que vous souhaitez qu'il soit• Vous pouvez trouver le bon/priorité d'annotation en cours d'exécution frappé tests sur les annotations de vous, avec vos propres commandes prises en compte
• Si l'annotation sélectionnée est correcte, grande. Sinon, sélectionnez manuellement l'annotation correcte à l'aide de
selectAnnotation:animated:
Et là vous l'avez. La méthode ci-dessus semble bien fonctionner, et l'impact sur les performances de l'exécution de cette chaque image n'est pas trop mauvais. Vous pouvez consulter également la commutation de MapBox, qui, je crois, prend en charge les annotations de la commande, mais ce n'est pas toujours une option pour diverses raisons.