J'utilise MKMapView et j'ai ajouté un certain nombre de broches d'annotation à la carte sur une zone de 5 à 10 kilomètres. Lorsque j'exécute l'application, ma carte commence à faire un zoom arrière pour montrer le monde entier, quelle est la meilleure façon de zoomer sur la carte pour que les épingles correspondent à la vue?
EDIT: Ma pensée initiale serait d'utiliser MKCoordinateRegionMake et de calculer le centre de coordonnées, longitudeDelta et latitudeDelta à partir de mes annotations. Je suis presque sûr que cela fonctionnera, mais je voulais juste vérifier que je ne manquais de rien d'évident.
Code ajouté, BTW: FGLocation est une classe conforme à MKAnnotation
, locationFake est l'un NSMutableArray
de ces objets. Les commentaires sont toujours les bienvenus ....
- (MKCoordinateRegion)regionFromLocations {
CLLocationCoordinate2D upper = [[locationFake objectAtIndex:0] coordinate];
CLLocationCoordinate2D lower = [[locationFake objectAtIndex:0] coordinate];
// FIND LIMITS
for(FGLocation *eachLocation in locationFake) {
if([eachLocation coordinate].latitude > upper.latitude) upper.latitude = [eachLocation coordinate].latitude;
if([eachLocation coordinate].latitude < lower.latitude) lower.latitude = [eachLocation coordinate].latitude;
if([eachLocation coordinate].longitude > upper.longitude) upper.longitude = [eachLocation coordinate].longitude;
if([eachLocation coordinate].longitude < lower.longitude) lower.longitude = [eachLocation coordinate].longitude;
}
// FIND REGION
MKCoordinateSpan locationSpan;
locationSpan.latitudeDelta = upper.latitude - lower.latitude;
locationSpan.longitudeDelta = upper.longitude - lower.longitude;
CLLocationCoordinate2D locationCenter;
locationCenter.latitude = (upper.latitude + lower.latitude) / 2;
locationCenter.longitude = (upper.longitude + lower.longitude) / 2;
MKCoordinateRegion region = MKCoordinateRegionMake(locationCenter, locationSpan);
return region;
}
la source
Réponses:
Vous avez raison.
Trouvez vos latitudes et longitudes maximales et minimales, appliquez une arithmétique simple et utilisez
MKCoordinateRegionMake
.Pour iOS 7 et supérieur, utilisez à
showAnnotations:animated:
partir deMKMapView.h
:la source
// Position the map such that the provided array of annotations are all visible to the fullest extent possible.
- (void)showAnnotations:(NSArray *)annotations animated:(BOOL)animated NS_AVAILABLE(10_9, 7_0);
showAnnotations
ajoute également les annotations à la carte, même si une annotation pour cet emplacement existe déjà.removeAnnotations(_ annotations:)
immédiatement aprèsshowAnnotations(_ annotations:animated)
C'est celui que j'ai trouvé ici qui a fonctionné pour moi:
(EDIT: J'ai mis à jour la solution en utilisant la suggestion de @ Micah d'augmenter le pointRect de 0,1 pour garantir que le rect ne finit pas par être infinitésimalement petit!)
Vous pouvez également le mettre à jour pour inclure la broche userLocation en remplaçant la première ligne par:
la source
Apple a ajouté une nouvelle méthode pour IOS 7 pour simplifier un peu la vie.
Vous pouvez facilement extraire un tableau stocké dans la vue de la carte:
et ajustez rapidement la caméra aussi!
cela ne fonctionnera que si l'utilisateur a installé iOS 7+ ou OS X 10.9+. découvrez l'animation personnalisée ici
la source
showAnnotations
cela ne fait pas un zoom / ajustement des annotations aussi proche que l'implémentation manuelle, donc je suis resté avec celui manuel.J'utilise ce code et fonctionne bien pour moi:
la source
En utilisation rapide
Dans l'objectif c
la source
mapView.showAnnotations(mapView.annotations, animated: true)
J'ai converti la réponse de Rafael Moreira. Le mérite lui revient. Pour ceux d'entre vous qui recherchent la version Swift, voici le code:
la source
Swift 3 Ceci est de manière correcte pour ajuster toutes les annotations dans la carte.
la source
La solution de @ jowie fonctionne très bien. Une prise, si une carte n'a qu'une seule annotation, vous vous retrouverez avec une carte entièrement dézoomée. J'ai ajouté 0,1 à la taille de la marque rect pour m'assurer que setVisibleMapRect a quelque chose à zoomer.
la source
Si vous recherchez iOS 8 et supérieur , la façon la plus simple de le faire est de définir la vue
var layoutMargins: UIEdgeInsets { get set }
de votre carte avant d'appelerfunc showAnnotations(annotations: [MKAnnotation], animated: Bool)
Par exemple (Swift 2.1):
la source
J'ai créé une extension pour afficher toutes les annotations en utilisant du code d'ici et là dans swift. Cela n'affichera pas toutes les annotations si elles ne peuvent pas être affichées même au niveau de zoom maximal.
la source
UIEdgeInsetsMake
paramètres, les valeurs entre 30 et 100 étaient bonnes pour moi. Je testais en utilisant l'iPhone SE i) S 10.2 Simulator. Exemple de code:setVisibleMapRect(zoomRect, edgePadding: UIEdgeInsetsMake(100, 100, 100, 100), animated: true)
. Remarque: ce code fonctionne dans Swift 3 et XCode 8.2.1.Ajout de cette boucle If dans la boucle for pour exclure la broche de localisation des utilisateurs de cette méthode (obligatoire dans mon cas, et peut-être d'autres)
la source
Pour iOS 7 et supérieur (référence MKMapView.h):
remarque de - Abhishek Bedi
Vous appelez simplement:
la source
Dans Swift
la source
// Édité pour swift 5
la source
Grâce à jowie, j'ai mis à jour mon ancienne catégorie vers une solution plus élégante. Partage d'une solution complète, presque prête à copier et coller
MKMapView + AnnotationsRegion.h
MKMapView + AnnotationsRegion.m
J'espère que cela aide quelqu'un et merci encore jowie!
la source
la source
Comme Abhishek Bedi le fait remarquer dans un commentaire, pour iOS7, la meilleure façon de procéder est:
Pour mon projet personnel (avant iOS7), j'ai simplement ajouté une catégorie sur la classe MKMapView pour encapsuler la fonctionnalité "zone visible" pour une opération très courante: la configurer pour qu'elle puisse voir toutes les annotations actuellement chargées sur l'instance MKMapView ( cela inclut autant de broches que vous auriez pu placer, ainsi que l'emplacement de l'utilisateur). 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. Ainsi, pour définir la région visible de mapView, le code serait alors aussi simple que:
J'espère que ça aide =)
la source
Toutes les réponses sur cette page supposent que la carte occupe le plein écran . J'ai en fait un affichage HUD (c'est-à-dire des boutons dispersés en haut et en bas) qui donne des informations sur la carte .. et donc les algorithmes sur la page afficheront les broches bien, mais certains d'entre eux apparaîtront sous les boutons d'affichage HUD .
Ma solution fait un zoom sur la carte pour afficher les annotations dans un sous-ensemble de l'écran et fonctionne pour différentes tailles d'écran (par exemple 3,5 "vs 4,0", etc.):
Voici ce que j'ai fait dans le code (remarque: j'utilise
NSConstraints
avec certaines méthodes d'aide pour faire fonctionner mon code dans différentes tailles d'écran .. alors que le code est assez lisible .. ma réponse ici l' explique mieux .. c'est fondamentalement le même flux de travail :)voici le code qui obtient la région qui correspond:
la source
J'ai fait une petite modification du code de Rafael pour la catégorie MKMapView.
la source
Sur la base des réponses ci-dessus, vous pouvez utiliser une méthode universelle pour zoomer sur la carte afin de s'adapter à toutes les annotations et superpositions en même temps.
Puis:
la source
Je partage juste mes observations à ce sujet:
Si vous utilisez xCode> 6 avec des tailles "déduites" pour les écrans (voir "Mesures simulées" dans l'inspecteur de fichiers) dans le storyboard, appelez
- (void)showAnnotations:(NSArray *)annotations animated:(BOOL)animated
dans
viewDidLoad
entraînera un niveau de zoom trop grand sur les iPhones de 4 pouces car la disposition de la carte est toujours à la taille des écrans plus larges du storyboard.Vous pouvez déplacer votre appel
showAnnotations...
versviewDidAppear
. Ensuite, la taille de la carte a déjà été ajustée à l'écran plus petit d'un iPhone 4.Ou bien changez la valeur "déduit" dans l'inspecteur de fichiers sous "mesures simulées" en iphone 4 pouces.
la source
Vous pouvez sélectionner les formes que vous souhaitez afficher avec les annotations.
la source
@ "Je ne sais pas si cela est dû à d'autres facteurs dans mon implémentation, mais je trouve que showAnnotations ne fait pas un zoom / ajustement des annotations aussi proche que l'implémentation manuelle, donc je suis resté avec le manuel. - Ted Avery 17 avril à 0:35 "
J'ai eu le même problème, mais j'ai ensuite essayé de faire showAnnotations deux fois (comme ci-dessous), et pour une raison quelconque, cela a fonctionné.
[mapView showAnnotations: votreAnnotationArray animé: OUI]; [mapView showAnnotations: votreAnnotationArray animé: OUI];
la source
Une manière compatible avec iOS 7 consiste à utiliser ce qui suit. Appelez d'abord
showAnnotation
afin d'obtenir un rectangle comprenant toutes les annotations. Ensuite, créez etUIEdgeInset
avec un insert supérieur de la hauteur de la broche. Ainsi, vous vous assurez d'afficher la broche entière sur la carte.la source
Mettez ceci dans votre code en conséquence:
la source