Zoom dans un MKMapView programmatique
j'utilise un MKMapView
à l'intérieur d'une application iPhone. Lorsque je clique sur un bouton, le niveau de zoom doit augmenter. C'est ma première approche:
MKCoordinateRegion zoomIn = mapView.region;
zoomIn.span.latitudeDelta *= 0.5;
[mapView setRegion:zoomIn animated:YES];
cependant, ce code n'a pas eu d'effet, puisque je n'ai pas mis à jour la valeur longitudinale. J'ai donc ajouté cette ligne:
zoomIn.span.longitudeDelta *= 0.5;
Maintenant ça marche, mais parfois seulement. latitudeDelta
et longitudeDelta
ne changent pas de la même façon, je veux dire, leurs valeurs ne sont pas proportionnelles. Une idée de comment résoudre ce problème?
8 réponses
je n'ai aucune idée si c'est la bonne façon de le faire, mais je suis en utilisant ce pour zoomer et dézoomer.
case 0: { // Zoom In
//NSLog(@"Zoom - IN");
MKCoordinateRegion region;
//Set Zoom level using Span
MKCoordinateSpan span;
region.center=mapView.region.center;
span.latitudeDelta=mapView.region.span.latitudeDelta /2.0002;
span.longitudeDelta=mapView.region.span.longitudeDelta /2.0002;
region.span=span;
[mapView setRegion:region animated:TRUE];
}
break;
// Zoom Out
case 2: {
//NSLog(@"Zoom - OUT");
MKCoordinateRegion region;
//Set Zoom level using Span
MKCoordinateSpan span;
region.center=mapView.region.center;
span.latitudeDelta=mapView.region.span.latitudeDelta *2;
span.longitudeDelta=mapView.region.span.longitudeDelta *2;
region.span=span;
[mapView setRegion:region animated:TRUE];
}
nettoyage dkdarel réponse
// delta is the zoom factor
// 2 will zoom out x2
// .5 will zoom in by x2
- (void)zoomMap:(MKMapView*)mapView byDelta:(float) delta {
MKCoordinateRegion region = mapView.region;
MKCoordinateSpan span = mapView.region.span;
span.latitudeDelta*=delta;
span.longitudeDelta*=delta;
region.span=span;
[mapView setRegion:region animated:YES];
}
Code Swift:
func zoomMap(byFactor delta: Double) {
var region: MKCoordinateRegion = self.mapView.region
var span: MKCoordinateSpan = mapView.region.span
span.latitudeDelta *= delta
span.longitudeDelta *= delta
region.span = span
mapView.setRegion(region, animated: true)
}
Voici une solution plus facile:
MKUserLocation *userLocation = mapView.userLocation;
MKCoordinateRegion region = MKCoordinateRegionMakeWithDistance (
userLocation.location.coordinate, 50, 50);
[mapView setRegion:region animated:NO];
voici ma façon de déplacer map vers le point d'annotation et de zoomer assez près de lui. Vous pouvez facilement changer le zoom dans la ligne CGFloat newLatDelta = 0.06f;
- (void)moveMapToAnnotation:(MKPointAnnotation*)annotation
{
CGFloat fractionLatLon = map.region.span.latitudeDelta / map.region.span.longitudeDelta;
CGFloat newLatDelta = 0.06f;
CGFloat newLonDelta = newLatDelta * fractionLatLon;
MKCoordinateRegion region = MKCoordinateRegionMake(annotation.coordinate, MKCoordinateSpanMake(newLatDelta, newLonDelta));
[map setRegion:region animated:YES];
}
vient de traduire la solution de dkardel pour swift:
@IBAction func zoomOutButtonClicked(sender: UIButton) {
let span = MKCoordinateSpan(latitudeDelta: mapView.region.span.latitudeDelta*2, longitudeDelta: mapView.region.span.longitudeDelta*2)
let region = MKCoordinateRegion(center: mapView.region.center, span: span)
mapView.setRegion(region, animated: true)
}
@IBAction func zoomInButtonClicked(sender: UIButton) {
let span = MKCoordinateSpan(latitudeDelta: mapView.region.span.latitudeDelta/2, longitudeDelta: mapView.region.span.longitudeDelta/2)
let region = MKCoordinateRegion(center: mapView.region.center, span: span)
mapView.setRegion(region, animated: true)
}
j'utilise le même code que le vôtre et il semble fonctionner. Ce qui se passe peut-être, c'est que votre delta ne change pas suffisamment pour que le niveau de zoom augmente d'un niveau de zoom de google à l'autre. Cela dépend également de l'état initial de votre carte, ce qui pourrait expliquer pourquoi elle est intermittente - alors comment paramétrez-vous la carte et le niveau de zoom pour commencer, avant que l'utilisateur n'appuie sur le bouton zoom?
vous pouvez aussi regarder dans la méthode regionThatFits qui ajustera la région vous fournissez (le nom est de mémoire que je n'ai pas les docs d'apple sous la main).
- (IBAction)btnZoomInPressed
{
MKCoordinateRegion region;
MKCoordinateSpan span;
region.center.latitude = lati;
region.center.longitude = longi;
span.latitudeDelta=viewMapSingleVenue.region.span.latitudeDelta /2.0002;
span.longitudeDelta=viewMapSingleVenue.region.span.longitudeDelta /2.0002;
region.span=span;
[viewMapSingleVenue setRegion:region animated:TRUE];
}
- (IBAction)btnZoomOutPressed
{
MKCoordinateRegion region;
MKCoordinateSpan span;
region.center.latitude = lati;
region.center.longitude = longi;
span.latitudeDelta=viewMapSingleVenue.region.span.latitudeDelta *2;
span.longitudeDelta=viewMapSingleVenue.region.span.longitudeDelta *2;
if(span.latitudeDelta < 200)
{
region.span=span;
[viewMapSingleVenue setRegion:region animated:TRUE];
}
}
mapView.setRegion
la méthode a des problèmes quand votre carte est tournée
vous pouvez zoomer sur la carte via mapView.camera.altitude
propriété, mais elle n'est pas animée:
mapView.camera.altitude *= 1.05
vous pouvez créer un nouvel objet caméra et le configurer avec l'animation:
let currentCamera = mapView.camera
let newCamera: MKMapCamera
if #available(iOS 9.0, *) {
newCamera = MKMapCamera(lookingAtCenter: currentCamera.centerCoordinate, fromDistance: currentCamera.altitude * 2, pitch: currentCamera.pitch, heading: currentCamera.heading)
} else {
newCamera = MKMapCamera()
newCamera.centerCoordinate = currentCamera.centerCoordinate
newCamera.heading = currentCamera.heading
newCamera.altitude = currentCamera.altitude * 2
newCamera.pitch = currentCamera.pitch
}
mapView.setCamera(newCamera, animated: true)