2009-06-23 28 views
23

Estoy usando un MKMapView dentro de una aplicación de iPhone. Cuando hago clic en un botón, el nivel de zoom debe aumentar. Esta es mi primera aproximación:Zoom en un MKMapView programmatically

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 actualizar el valor longitudeDelta. Así que agregué esta línea:

zoomIn.span.longitudeDelta *= 0.5; 

Ahora funciona, pero solo algunas veces. El latitudeDelta y longitudeDelta no cambian de la misma manera, es decir, sus valores no son proporcionales. Alguna idea de como resolver esto?

Respuesta

1

Utilizo un código similar al suyo y parece que funciona. 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 proporcione (el nombre es de memoria ya que no tengo los documentos de Apple a mano).

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]; 
    } 
+0

Me ayuda aswell, gracias bro – user366584

+0

Esto funciona bien, pero cuando continuamente Presione el botón de zoom hacia fuera que me diera una excepción después de un cierto nivel . ¿Cómo puedo prevenirlo? –

+0

Cool. ¿Cuál es el punto de dividir por 2.0002 en lugar de 2? Sólo curiosidad :) – dustinrwh

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]; 
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) 
} 
+1

Esto funciona perfectamente para mí. – Sadurnias

+0

creo que esto sería un código func zoomRegion rápida correcto (región: inout MKCoordinateRegion, byFactor delta: Doble) {var lapso: MKCoordinateSpan = region.span span.latitudeDelta * = delta span.longitudeDelta * = delta region.span = span } –

2

Aquí es mi manera de mover el mapa al punto de anotación y acercarlo bastante. Usted puede cambiar fácilmente el zoom en la línea 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]; 
} 
+0

Eso es exactamente lo que estaba buscando .. Gracias hermano –

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]; 
    } 
} 
2

solución de dkardel Sólo traducida 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) 
} 
1

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

Puedes ampliar mapa a través de la propiedad mapView.camera.altitude, pero no está animado:

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)