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?

23
demandé sur luca 2009-06-23 14:37:41

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];
    }
27
répondu dkardell 2009-07-29 13:58:40

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)
}
23
répondu Kevin 2016-08-29 17:13:11

Voici une solution plus facile:

MKUserLocation *userLocation = mapView.userLocation;
MKCoordinateRegion region = MKCoordinateRegionMakeWithDistance (
      userLocation.location.coordinate, 50, 50);
[mapView setRegion:region animated:NO];
21
répondu Roosevelt 2012-11-28 17:40:39

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];
}
2
répondu Baca6u 2014-04-01 10:57:31

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)
}
2
répondu Mohamed Said 2015-03-31 08:43:03

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).

1
répondu frankodwyer 2009-06-23 12:16:37
- (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];
    }
}
1
répondu Venu Gopal Tewari 2015-02-20 15:14:30

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)
1
répondu Evgeny Karev 2017-05-17 12:33:03