Réglage du niveau de zoom pour un MKMapView

J'ai une carte qui montre correctement, la seule chose que je veux faire maintenant est de régler le niveau de zoom quand il se charge. Y a-t-il un moyen de faire cela?

Merci

Je me suis trouvé une solution, ce qui est très simple et fait l'affaire. Utilisez MKCoordinateRegionMakeWithDistance pour définir la distance en mètres verticalement et horizontalement pour get le zoom souhaité. Et bien sûr, lorsque vous mettez à jour votre position, vous obtenez les bonnes coordonnées, ou vous pouvez le spécifier directement dans le CLLocationCoordinate2D au démarrage, si c'est ce que vous devez faire:

 CLLocationCoordinate2D noLocation; MKCoordinateRegion viewRegion = MKCoordinateRegionMakeWithDistance(noLocation, 500, 500); MKCoordinateRegion adjustedRegion = [self.mapView regionThatFits:viewRegion]; [self.mapView setRegion:adjustedRegion animated:YES]; self.mapView.showsUserLocation = YES; 

Basé sur le fait que les lignes de longitude sont espacées également à n'importe quel sharepoint la carte, il existe une implémentation très simple pour définir centerCoordinate et zoomLevel:

 @interface MKMapView (ZoomLevel) @property (assign, nonatomic) NSUInteger zoomLevel; - (void)setCenterCoordinate:(CLLocationCoordinate2D)centerCoordinate zoomLevel:(NSUInteger)zoomLevel animated:(BOOL)animated; @end @implementation MKMapView (ZoomLevel) - (void)setZoomLevel:(NSUInteger)zoomLevel { [self setCenterCoordinate:self.centerCoordinate zoomLevel:zoomLevel animated:NO]; } - (NSUInteger)zoomLevel { return log2(360 * ((self.frame.size.width/256) / self.region.span.longitudeDelta)) + 1; } - (void)setCenterCoordinate:(CLLocationCoordinate2D)centerCoordinate zoomLevel:(NSUInteger)zoomLevel animated:(BOOL)animated { MKCoordinateSpan span = MKCoordinateSpanMake(0, 360/pow(2, zoomLevel)*self.frame.size.width/256); [self setRegion:MKCoordinateRegionMake(centerCoordinate, span) animated:animated]; } @end 

Ce n'est pas embedded, mais j'ai vu / utilisé ce code. Cela vous permet d'utiliser ceci:

 [mapView setCenterCoordinate:myCoord zoomLevel:13 animated:YES]; 

Note: Ce n'est pas mon code, je ne l'ai pas écrit, donc je ne peux pas m'en atsortingbuer le mérite

Vous pouvez également effectuer un zoom en utilisant MKCoordinateRegion et en définissant sa latitude et sa longitude. Voici une reference rapide et voici la reference iOS. Il ne fera rien de fantaisiste mais devrait vous permettre de régler le zoom quand il dessine la carte.


 MKCoordinateRegion region; region.center.latitude = {desired lat}; region.center.longitude = {desired lng}; region.span.latitudeDelta = 1; region.span.longitudeDelta = 1; mapView.region = region; 

Modifier 1:

 MKCoordinateRegion region; region.center.latitude = {desired lat}; region.center.longitude = {desired lng}; region.span.latitudeDelta = 1; region.span.longitudeDelta = 1; region = [mapView regionThatFits:region]; [mapView setRegion:region animated:TRUE]; 

Une implémentation Swift simple, si vous utilisez des points de vente.

 @IBOutlet weak var mapView: MKMapView! { didSet { let noLocation = CLLocationCoordinate2D() let viewRegion = MKCoordinateRegionMakeWithDistance(noLocation, 500, 500) self.mapView.setRegion(viewRegion, animated: false) } } 

Basé sur la réponse de @ Carnal.

Basé sur la grande réponse de @ AdilSoomro. Je suis venu avec ceci:

 @interface MKMapView (ZoomLevel) - (void)setCenterCoordinate:(CLLocationCoordinate2D)centerCoordinate zoomLevel:(NSUInteger)zoomLevel animated:(BOOL)animated; -(double) getZoomLevel; @end @implementation MKMapView (ZoomLevel) - (void)setCenterCoordinate:(CLLocationCoordinate2D)centerCoordinate zoomLevel:(NSUInteger)zoomLevel animated:(BOOL)animated { MKCoordinateSpan span = MKCoordinateSpanMake(0, 360/pow(2, zoomLevel)*self.frame.size.width/256); [self setRegion:MKCoordinateRegionMake(centerCoordinate, span) animated:animated]; } -(double) getZoomLevel { return log2(360 * ((self.frame.size.width/256) / self.region.span.longitudeDelta)); } @end 

Pour Swift 3, c'est plutôt rapide:

 private func setMapRegion(for location: CLLocationCoordinate2D, animated: Bool) { let viewRegion = MKCoordinateRegionMakeWithDistance(location, <#T##latitudinalMeters: CLLocationDistance##CLLocationDistance#>, <#T##longitudinalMeters: CLLocationDistance##CLLocationDistance#>) MapView.setRegion(viewRegion, animated: animated) } 

Il suffit de définir le lat-, long-mètres <CLLocationDistance> et le mapView adaptera le niveau de zoom à vos valeurs.

Mise en œuvre rapide

 import Foundation import MapKit class MapViewWithZoom: MKMapView { var zoomLevel: Int { get { return Int(log2(360 * (Double(self.frame.size.width/256) / self.region.span.longitudeDelta)) + 1); } set (newZoomLevel){ setCenterCoordinate(coordinate:self.centerCoordinate, zoomLevel: newZoomLevel, animated: false) } } private func setCenterCoordinate(coordinate: CLLocationCoordinate2D, zoomLevel: Int, animated: Bool){ let span = MKCoordinateSpanMake(0, 360 / pow(2, Double(zoomLevel)) * Double(self.frame.size.width) / 256) setRegion(MKCoordinateRegionMake(coordinate, span), animated: animated) } } 

J'espère que le fragment de code suivant pourrait vous aider.

 - (void)handleZoomOutAction:(id)sender { MKCoordinateRegion newRegion=MKCoordinateRegionMake(mapView.region.center,MKCoordinateSpanMake(mapView.region.s pan.latitudeDelta/0.5, mapView.region.span.longitudeDelta/0.5)); [mapView setRegion:newRegion]; } - (void)handleZoomInAction:(id)sender { MKCoordinateRegion newRegion=MKCoordinateRegionMake(mapView.region.center,MKCoordinateSpanMake(mapView.region.span.latitudeDelta*0.5, mapView.region.span.longitudeDelta*0.5)); [mapView setRegion:newRegion]; } 

Vous pouvez choisir n'importe quelle valeur au lieu de 0.5 pour réduire ou augmenter le niveau de zoom. J'ai utilisé ces methods sur un clic de deux buttons.

Je sais que c'est une réponse tardive, mais je voulais juste aborder la question de la définition du niveau de zoom moi-même. La réponse de goldmine est géniale mais je trouve que ça ne marche pas assez bien dans ma request.

En y regardant de plus près, Goldmine déclare que «les lignes de longitude sont espacées de manière égale en tout sharepoint la carte». Ce n'est pas vrai, il s'agit en fait de lignes de latitude espacées également de -90 (pôle sud) à +90 (pôle nord). Les lignes de longitude sont espacées au maximum à l'équateur, convergeant vers un point aux pôles.

L'implémentation que j'ai adoptée consiste donc à utiliser le calcul de la latitude comme suit:

 @implementation MKMapView (ZoomLevel) - (void)setCenterCoordinate:(CLLocationCoordinate2D)coordinate zoomLevel:(NSUInteger)zoom animated:(BOOL)animated { MKCoordinateSpan span = MKCoordinateSpanMake(180 / pow(2, zoom) * self.frame.size.height / 256, 0); [self setRegion:MKCoordinateRegionMake(coordinate, span) animated:animated]; } @end 

J'espère que ça aide à ce stade avancé.

Une réponse Swift 2.0 utilisant NSUserDefaults pour sauvegarder et restaurer le zoom et la position de la carte.

Fonction pour save la position de la carte et le zoom:

 func saveMapRegion() { let mapRegion = [ "latitude" : mapView.region.center.latitude, "longitude" : mapView.region.center.longitude, "latitudeDelta" : mapView.region.span.latitudeDelta, "longitudeDelta" : mapView.region.span.longitudeDelta ] NSUserDefaults.standardUserDefaults().setObject(mapRegion, forKey: "mapRegion") } 

Exécutez la fonction chaque fois que la carte est déplacée:

 func mapView(mapView: MKMapView, regionDidChangeAnimated animated: Bool) { saveMapRegion(); } 

Fonction pour save le zoom et la position de la carte:

 func restoreMapRegion() { if let mapRegion = NSUserDefaults.standardUserDefaults().objectForKey("mapRegion") { let longitude = mapRegion["longitude"] as! CLLocationDegrees let latitude = mapRegion["latitude"] as! CLLocationDegrees let center = CLLocationCoordinate2D(latitude: latitude, longitude: longitude) let longitudeDelta = mapRegion["latitudeDelta"] as! CLLocationDegrees let latitudeDelta = mapRegion["longitudeDelta"] as! CLLocationDegrees let span = MKCoordinateSpan(latitudeDelta: latitudeDelta, longitudeDelta: longitudeDelta) let savedRegion = MKCoordinateRegion(center: center, span: span) self.mapView.setRegion(savedRegion, animated: false) } } 

Ajoutez ceci à viewDidLoad:

 restoreMapRegion()