2010-01-17 27 views
18

Quiero establecer una región en mi MKMapView y luego encontrar las coordenadas correspondientes a la esquina NE y SW del mapa.¿Cómo puedo saber cuándo ha finalizado MKMapview setRegion: animated:?

This code works just fine to do that: 
//Recenter and zoom map in on search location 
MKCoordinateRegion region = {{0.0f, 0.0f}, {0.0f, 0.0f}}; 
region.center = mySearchLocation.searchLocation.coordinate; 
region.span.longitudeDelta = 0.01f; 
region.span.latitudeDelta = 0.01f; 
[self.mapView setRegion:region animated:NO]; //When this is set to YES it seems to break the coordinate calculation because the map is in motion 

//After the new search location has been added to the map, and the map zoomed, we need to update the search bounds 
//First we need to calculate the corners of the map so we get the points 
CGPoint nePoint = CGPointMake(self.mapView.bounds.origin.x + mapView.bounds.size.width, mapView.bounds.origin.y); 
CGPoint swPoint = CGPointMake((self.mapView.bounds.origin.x), (mapView.bounds.origin.y + mapView.bounds.size.height)); 

//Then transform those point into lat,lng values 
CLLocationCoordinate2D neCoord; 
neCoord = [mapView convertPoint:nePoint toCoordinateFromView:mapView]; 
CLLocation *neLocation = [[CLLocation alloc] initWithLatitude:neCoord.latitude longitude:neCoord.longitude]; 

CLLocationCoordinate2D swCoord; 
swCoord = [mapView convertPoint:swPoint toCoordinateFromView:mapView]; 
CLLocation *swLocation = [[CLLocation alloc] initWithLatitude:swCoord.latitude longitude:swCoord.longitude]; 

El problema es que me gustaría que el zoom del mapa sea animado. Sin embargo, cuando configuro setRegion: animado a YES, termino obteniendo las coordenadas del mapa cuando se aleja (es decir, antes de que se complete la animación). ¿Hay alguna manera de obtener una señal de que la animación está hecha?

Respuesta

21

mapkit no utilizado pero el MKMapViewDelegate tiene un método mapView:regionDidChangeAnimated: que parece ser lo que estás buscando.

+0

me estúpida, que fue en el protocolo de delegado no la propia MKMapView. Sabía que lo había visto en alguna parte ... gracias: D – deadroxy

4

Sé que esto es muy viejo, pero por si acaso alguien viene buscando una respuesta, aquí hay una alternativa.

Lo bueno de esta versión es que puede ejecutar una animación de finalización en el momento exacto en que se completa la primera en lugar de adivinar/codificarla en el método de devolución de llamada, ya que esa se llama de inmediato.

[MKMapView animateWithDuration:1.0 animations:^{ 
    [mapView setRegion:mapRegion animated:YES]; 
} completion:^(BOOL finished) { 
    [UIView animateWithDuration:1.0 animations:^{ 
     self.mapDotsImageView.alpha = 1.0; 
    }]; 
}]; 

o simplemente

// zoom in... 
let km3:CLLocationDistance = 3000 
let crTight = MKCoordinateRegionMakeWithDistance(location.coordinate, km3, km3) 
MKMapView.animate(withDuration: 1.0, animations: { self.theMap.region = crTight }) 
Cuestiones relacionadas