Zoom en un MKMapView programáticamente

votos
23

Estoy usando una MKMapViewaplicación dentro de un iPhone. Cuando hago clic en un botón, el nivel de zoom debe aumentar. Este es mi primer acercamiento:

MKCoordinateRegion zoomIn = mapView.region;
zoomIn.span.latitudeDelta *= 0.5;
[mapView setRegion:zoomIn animated:YES];

Sin embargo, este código no tuvo ningún efecto, ya que no actualicé el valor longitudeDelta. Así que agregué esta línea:

zoomIn.span.longitudeDelta *= 0.5;

Ahora funciona, pero solo algunas veces. El latitudeDeltay longitudeDeltano cambian de la misma manera, quiero decir, sus valores no son proporcionales. Alguna idea de como resolver esto?

Publicado el 23/06/2009 a las 11:37
fuente por usuario
En otros idiomas...                            


9 respuestas

votos
27

No tengo idea si esta es la manera correcta de hacerlo, pero estoy usando esto para acercar y alejar.

        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];
    }
Respondida el 29/07/2009 a las 14:58
fuente por usuario

votos
21

Sólo la limpieza de la respuesta de dkdarel

// 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];

}

Código 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)
}
Respondida el 21/11/2013 a las 19:43
fuente por usuario

votos
21

Aquí es una solución más fácil:

MKUserLocation *userLocation = mapView.userLocation;
MKCoordinateRegion region = MKCoordinateRegionMakeWithDistance (
      userLocation.location.coordinate, 50, 50);
[mapView setRegion:region animated:NO];
Respondida el 28/11/2012 a las 18:40
fuente por usuario

votos
2

Sólo traducida solución de dkardel a esperar:

@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)
}
Respondida el 31/03/2015 a las 08:43
fuente por usuario

votos
2

Esta es mi manera de mover el mapa hasta el punto de anotación y un zoom muy cerca de ella. Usted puede cambiar fácilmente el zoom de acuerdoCGFloat 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];
}
Respondida el 01/04/2014 a las 11:57
fuente por usuario

votos
1

mapView.setRegion método tiene un problema cuando se gira el mapa

Puedes ampliar mapa a través de mapView.camera.altitudela propiedad, pero no se anima:

mapView.camera.altitude *= 1.05

Puede crear nuevo objeto cámara y configurarlo con la animación:

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)
Respondida el 17/05/2017 a las 09:33
fuente por usuario

votos
1
- (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];
    }
}
Respondida el 20/02/2015 a las 13:56
fuente por usuario

votos
1

Utilizo un código similar al suyo y parece funcionar. Lo que puede estar sucediendo es que su delta no está cambiando lo suficiente como para hacer que el nivel de zoom aumente de un nivel de zoom de Google al siguiente. Esto también dependería del estado inicial de su mapa, lo que podría explicar por qué es intermitente. Entonces, ¿cómo establece el mapa y el nivel de zoom para empezar, antes de que el usuario presione el botón de zoom?

También podría buscar en la región el método ThatFits que ajustará la región que proporcionó (el nombre es de la memoria ya que no tengo los documentos de Apple a mano).

Respondida el 23/06/2009 a las 13:16
fuente por usuario

votos
0

En Swift 4.2

let location = mapView.userLocation
let region = MKCoordinateRegion(center: location.coordinate, span: MKCoordinateSpan(latitudeDelta: 50, longitudeDelta: 50))
mapView.setRegion(region, animated: true)
Respondida el 22/03/2019 a las 12:02
fuente por usuario

Cookies help us deliver our services. By using our services, you agree to our use of cookies. Learn more