2010-11-29 5 views
3

Voici la situation: J'affiche des images sur la carte en utilisant des annotations personnalisées. Tout fonctionne bien, mais je voudrais l'améliorer visuellement par en redimensionnant l'AnnotationView afin qu'il se rétracte lorsque la carte est réduite. Je veux faire cela parce que, évidemment, plus d'annotations remplissent l'écran et doivent être rétrécies afin qu'elles ne se chevauchent pas trop et que l'utilisateur puisse voir plus d'annotations. (Bien sûr, je voudrais agrandir AnnotationViews lorsque la carte est agrandie à nouveau).Redimensionnement personnalisé MKAnnotationView selon le niveau de zoom MapKit

Je l'ai fait en supprimant toutes les annotations de la carte et en les rajoutant à chaque fois que regionDidChangeAnimated est appelée. Cependant, ces images sont chargées à partir d'Internet, donc le téléchargement des images à nouveau (puisque les annotations ont été supprimées) ne semble pas avoir de sens.

J'espère avoir bien expliqué la situation et j'espère pouvoir contribuer à l'avenir.

Merci d'avance.

P.S. Je développe avec iOS 4.0

Répondre

1

Depuis que vous utilisez iOS 4.0, je suggère d'utiliser une classe qui se conforme au protocole MKOverlay au lieu de MKAnnotationView. Les superpositions zooment avec la carte et évolueront de manière appropriée. Vous pouvez probablement utiliser 1 superposition pour gérer toutes vos annotations. Jetez un coup d'œil à la démo HazardMap fournie par Apple lors des pourparlers WWDC 2010 sur http://developer.apple.com

Vous pouvez également utiliser l'algorithme k plus proches voisins pour regrouper les annotations par échelle de zoom. Cependant, cela peut être un peu lent si vous avez beaucoup d'annotations. Je l'ai essayé une fois avec plusieurs milliers d'annotations et n'a pas aimé le coup de performance qui a été encouru. Je pense que < 1000 annotations pourraient avoir des performances décentes avec cette méthode si.

+0

Merci, je n'ai jamais pensé à l'approche MKOverlay. J'ai vérifié le protocole MKOverlay et le HazardMap et je pense, avec quelques réglages, je peux être en mesure de l'appliquer à mon problème. Une chose cependant: puisque MKOverlay sont des zones (par rapport à une MKAnnotation, qui est un point sur la carte), l'image ne serait-elle pas trop petite quand la carte est agrandie? Pour clarifier le projet: la carte affiche des photos géolocalisées de flickr, de sorte que ces vignettes ont des emplacements exacts, et peuvent avoir beaucoup de photos voisines aussi. J'espère que je ne vous ai pas confondu. Merci encore. – kiblee

+0

Oui, il pourrait finir trop petit pour voir. Cependant, avec des superpositions, vous avez accès à l'actuelle MKZoomScale (voir MKOverlayView drawMapRect: zoomScale: inContext :). Vous pouvez donc ajuster la taille en pixels des images à dessiner sur la base du zoomScale. – afarnham

1

On dirait que vous êtes déjà sur la bonne voie et que le seul vrai problème est le téléchargement des images. Y a-t-il une raison particulière pour laquelle vous ne pouvez pas les mettre en cache en les écrivant dans le répertoire de documents (ou le répertoire de cache si vous voulez qu'ils se déconnectent) quand vous les recevez et regardez-les avant de les afficher?

+0

Hmm, existe-t-il une limite de mémoire pour la mise en cache de ces images dans le répertoire de cache? Bien qu'il serait difficile de gérer toutes ces images dans le cache, cela pourrait être une solution plutôt simple, mais efficace. Les images seraient des vignettes pour les images Flickr. – kiblee

+0

Je ne sais pas s'il y a une limite concrète, bien qu'il y ait évidemment une limite pratique - si vous mangez un Go d'espace beaucoup d'utilisateurs seraient mécontents, pas qu'ils sauraient nécessairement que c'était vous. Une cache légèrement gérée où vous supprimez toutes les 200 dernières images, ou 500, ou tout ce qui est raisonnable. –

Questions connexes