Redimensionner MKAnnotationView Image Lorsque la carte effectue un zoom avant et à l'extérieur?
Ce que j'ai
J'ai environ 150 MKAnnotationViews sur une carte.
Chaque MKAnnotationView a une image qui remplace le code pin par défaut.
Ce qui se passe maintenant
Lorsque la carte effectue un zoom avant, la MKAnnotationViews sont de plus en plus petits et à l'opposé, lorsqu'il effectue un zoom arrière.
Ce que je souhaite est Arrivé
Eh bien, je veux qu'il soit dans l'autre sens. Depuis quand la carte est petite, je souhaite que les MKAnnotationViews sera plus faible, de sorte que l'utilisateur peut voir tous, et quand il zoome je souhaite qu'ils seront plus grand.
Ce code je l'ai
Je sais comment obtenir le zoom de changement, et je sais que je peux obtenir le "pMapView.la région.span.latitudeDelta" comme une référence pour le zoom montant. et je sais que je peux changer le annotationView.cadre.
-(void)mapView:(MKMapView *)pMapView regionDidChangeAnimated:(BOOL)animated{
NSLog(@"mapView.region.span.latitudeDelta = %f",pMapView.region.span.latitudeDelta);
for (id <MKAnnotation> annotation in pMapView.annotations) {
MKAnnotationView *annotationView = [pMapView viewForAnnotation: annotation];
}
}
Quelqu'un peut m'aider s'il vous plaît?
Merci
shani
Vous devez vous connecter pour publier un commentaire.
En fait sur la valeur par défaut MKMapView - l'annotation (par exemple, la broche ou de l'image) et la légende (par exemple, la bulle) restent de la même taille que vous effectuez un zoom avant ou arrière. Ils ne sont pas à l'échelle. Mais je reçois votre point - en ce qui concerne la carte, ils semblent être de plus en plus que la carte effectue un zoom arrière et de la réduction de la carte effectue un zoom avant.
Il y a donc deux solutions à votre problème et ils fonctionnent un peu différemment:
-(void)mapView:(MKMapView *)pMapView regionDidChangeAnimated:(BOOL)animated
de la MKMapViewDelegate Protocole de Référence - qui vous l'ai déjà fait.UIPinchGestureRecognizer
à la MKMapView objet et de mettre en œuvre l'action.Option #1 -
mapView:regionDidChangeAnimated:
sera appelé pour un défilement ou un zoom de l'événement - en fait tout le temps la carte de la région a changé comme le nom l'indique. Cela résulte en un peu moins lisse redimensionnement d'icônes, parce que la carte des événements sont déclenchés moins fréquemment.Mes préférences est pour l'Option #2 - Joindre un
UIPinchGestureRecognizer
à la MKMapView objet et de mettre en œuvre l'action. Geste de pincement avec les événements sont déclenchés assez rapidement, de sorte que vous obtenir une surface lisse redimensionnement de l'icône. Et ils ne le feu en cas de reconnaissance de pincement de l'événement, de sorte qu'ils ne se déclenche pas lors d'un événement scroll.Les méthodes d'action invoquée doit être conforme à l'une des signatures suivantes:
Vous devez être prudent pour ne pas remplacer les cartes de zoom par défaut de comportement. Voir ce post: "UIMapView: UIPinchGestureRecognizer ne s'appelle pas" pour plus d'info. Réponse courte est que vous avez à mettre en œuvre
shouldRecognizeSimultaneouslyWithGestureRecognizer:
et retour OUI.Tout dit ici est un exemple de code:
Donc, à ce moment - vous avez plusieurs options pour redimensionner l'annotation. Les deux exemples de code suivants s'appuient sur Troy Brant code pour obtenir le niveau de zoom d'un MKMapView.
Voici quelques autres exemples de code:
Si cela fonctionne, n'oubliez pas de le marquer comme réponse.
Désolé pour mon mauvais anglais... mais je veux juste aider quelqu'un.
Merci beaucoup, Funktional. Votre réponse est très bien... son travail sur iOS5 parfaitement! Mais c'est invalidée sur iOS6, et il semble qu'il n'y a pas de solution pour résoudre ce problème pour l'instant.
Mais finalement, je l'ai résolu en un stupide/de manière statique et il fonctionne très bien sur les deux iOS. Je ne vais pas expliquer trop. C'est ce que j'ai fait dans mon projet.
L'image pour la mkannotation est nommé pin.png (la taille est 20x20)
J'ai créé plus de cinq images avec différentes tailles pour les différents niveaux de zoom (18x18, 16x16, 14x14, 12x12, 10x10) et ils portent le nom de la broche 5.png, pin-4.png, pin-3.png, pin-2.png, pin-1.png.
J'ai enlevé tout le code sur le calcul de l'échelle dans formatAnnotationView et a ajouté cette ligne
Aussi, ce changement de
UIImage *pinImage = [UIImage imageNamed:@"YOUR_IMAGE_NAME_HERE"];
à
UIImage *pinImage = [[UIImage alloc] initWithContentsOfFile:imageName];
ajouter cette fonction
désolé pour le mauvais codage et de l'anglais.
Une méthode alternative consiste à re-taille de la vue d'annotation de l'image des biens. Un exemple est indiqué dans ce post
Dans Swift 3, cela a fonctionné pour moi. Mon image était de 100% au niveau 19, donc 1/19 me donne 0.5263158 qui est mon échelle linéaire:
@Funktional réponse rapide 3: