J'ai plusieurs annotations que je veux ajouter à mon MKMapView (il pourrait 0-n éléments, où n est généralement autour de 5). Je peux bien ajouter les annotations, mais je souhaite redimensionner la carte pour qu'elle corresponde à toutes les annotations à l'écran à la fois, et je ne sais pas comment procéder.
J'ai regardé -regionThatFits:
mais je ne sais pas trop quoi en faire. Je publierai du code pour montrer ce que j'ai jusqu'à présent. Je pense que cela devrait être une tâche généralement simple, mais je me sens un peu dépassé par MapKit jusqu'à présent.
- (void)locationManager:(CLLocationManager *)manager didUpdateToLocation:(CLLocation *)newLocation fromLocation:(CLLocation *)oldLocation{
location = newLocation.coordinate;
//One location is obtained.. just zoom to that location
MKCoordinateRegion region;
region.center = location;
//Set Zoom level using Span
MKCoordinateSpan span;
span.latitudeDelta = 0.015;
span.longitudeDelta = 0.015;
region.span = span;
// Set the region here... but I want this to be a dynamic size
// Obviously this should be set after I've added my annotations
[mapView setRegion:region animated:YES];
// Test data, using these as annotations for now
NSArray *arr = [NSArray arrayWithObjects:@"one", @"two", @"three", @"four", nil];
float ex = 0.01;
for (NSString *s in arr) {
JBAnnotation *placemark = [[JBAnnotation alloc] initWithLat:(location.latitude + ex) lon:location.longitude];
[mapView addAnnotation:placemark];
ex = ex + 0.005;
}
// What do I do here?
[mapView setRegion:[mapView regionThatFits:region] animated:YES];
}
Remarquez, tout cela se produit lorsque je reçois une mise à jour de l'emplacement ... Je ne sais pas si c'est un endroit approprié pour le faire. Sinon, quel serait le meilleur endroit? -viewDidLoad
?
Merci d'avance.
la source
MKMapView
et changé la méthode en- (void) zoomToFitAnnotations:(BOOL)animated
. Fonctionne parfaitement!Pourquoi si compliqué?
la source
[mapView setVisibleMapRect:mapRect edgePadding:UIEdgeInsetsMake(20.0f, 20.0f, 20.0f, 20.0f) animated:animated];
CLLocationCoordinate2D *coords
tableau? Utilisationmalloc()
?r
ce quiCGFloat zoomOutPercent = 0.2f; r = MKMapRectMake(r.origin.x-r.size.width*zoomOutPercent, r.origin.y-r.size.height*zoomOutPercent, r.size.width*(1+zoomOutPercent*2), r.size.height*(1+zoomOutPercent*2));
J'ai fait quelque chose de similaire pour effectuer un zoom arrière (ou avant) sur une zone qui comprenait une annotation de point et l'emplacement actuel. Vous pouvez développer cela en parcourant vos annotations.
Les étapes de base sont:
la source
MKCoordinateRegionMake
: gist.github.com/1599700 au cas où quelqu'un voudrait toujours le faire de cette façon.J'ai une réponse différente. J'allais implémenter moi-même l'algorithme du zoom pour ajuster, mais j'ai pensé qu'Apple devait avoir un moyen de faire ce que nous voulions sans trop de travail. L'utilisation de l'API doco a rapidement montré que je pouvais utiliser MKPolygon pour faire ce qui était nécessaire:
J'espère que cela t'aides.
la source
vous pouvez également le faire de cette façon.
la source
Sur la base des informations et des suggestions de tout le monde, j'ai trouvé ce qui suit. Merci à tous ceux qui participent à cette discussion pour leur contribution :) Cela irait dans la vue Controller qui contient la mapView.
la source
Dans mon cas, je commence par les objets CLLocation et je crée des annotations pour chacun d'eux.
Je n'ai besoin que de placer deux annotations, donc j'ai une approche simple pour construire le tableau de points, mais il pourrait facilement être étendu pour créer un tableau avec une longueur arbitraire étant donné un ensemble de CLLocations.
Voici mon implémentation (ne nécessite pas la création de MKMapPoints):
la source
En utilisant Swift, un polygone et un rembourrage supplémentaire, j'ai utilisé ce qui suit:
la source
Il existe une nouvelle méthode dans 'MKMapView' à partir d'iOS 7 que vous pouvez utiliser
la source
Je sais que c'est une vieille question mais, si vous voulez afficher toutes les annotations DÉJÀ SUR la carte, utilisez ceci:
la source
Voici l'équivalent SWIFT (travail confirmé dans: Xcode6.1, SDK 8.2) pour les réponses de Mustafa:
la source
Une solution possible pourrait être de mesurer la distance entre l'emplacement actuel et toutes les annotations et d'utiliser la méthode MKCoordinateRegionMakeWithDistance pour créer une région dont la distance est légèrement supérieure à l'annotation la plus éloignée.
Cela deviendrait bien sûr plus lent avec le nombre d'annotations ajoutées.
la source
la source
Basé sur l'excellente réponse de
me2
(maintenant dans Swift)la source
Ajout d'une petite clause if pour gérer 1 emplacement - à ajouter à l'extrait de code cound de mustufa. Utilisation de la fonction zoomToAnnotation de pkclSoft pour cela:
la source
ce code fonctionne pour moi, il montre toutes les broches avec l'emplacement actuel, j'espère que cela vous aidera,
la source
J'espère que c'est au moins pertinent, c'est ce que j'ai mis en place pour Mono (basé sur la réponse de pkclSoft):
la source
la source
Sur la base de la réponse me2, j'ai écrit une catégorie pour MKMapView pour ajouter des marges et ignorer l'annotation de l'emplacement de l'utilisateur:
la source
Comme je ne peux pas commenter une réponse, j'aimerais ajouter mon peu de commodité à la réponse de @ me2 (puisque je pensais que c'était l'approche la plus élégante trouvée ici).
Pour mon projet personnel, j'ai simplement ajouté une catégorie sur la classe MKMapView pour encapsuler la fonctionnalité "zone visible" pour une opération très courante: paramétrer pour pouvoir voir toutes les annotations actuellement chargées sur l'instance MKMapView. le résultat était le suivant:
fichier .h
fichier .m
Comme vous pouvez le voir, j'ai ajouté jusqu'à présent 2 méthodes: une pour définir la région visible de la carte sur celle qui correspond à toutes les annotations actuellement chargées sur l'instance MKMapView, et une autre méthode pour la définir sur n'importe quel tableau d'objets. Donc, pour définir la région visible de mapView, le code serait alors aussi simple que:
J'espère que ça aide =)
la source
Considérez cette extension:
la source
Une version rapide 5:
la source
Ajout à la réponse de Stéphane de Luca . Ici, nous pouvons conserver UserLocation plus les annotations personnalisées pour s'adapter à MKMapView
la source