25 Stimmen

Wie kann ich wissen, wann MKMapview setRegion:animated: beendet ist?

Ich möchte eine Region auf meiner MKMapView festlegen und dann die Koordinaten finden, die der NE- und SW-Ecke der Karte entsprechen.

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

Das Problem ist, dass ich möchte, dass der Kartenzoom animiert ist. Wenn ich jedoch setRegion:animated auf YES setze, erhalte ich am Ende die Koordinaten von der Karte, wenn sie weit herausgezoomt ist (d. h. bevor die Animation abgeschlossen ist). Gibt es eine Möglichkeit, ein Signal zu erhalten, dass die Animation abgeschlossen ist?

26voto

bmalicoat Punkte 2488

Ich habe mapkit nie benutzt, aber die MKMapViewDelegate hat eine Methode mapView:regionDidChangeAnimated: Das scheint das zu sein, wonach Sie suchen.

Beachten Sie, dass mapView:regionDidChangeAnimated: wird aufgerufen jede wenn sich eine Änderung ergibt, z. B. wenn der Benutzer die Karte verschiebt.

14voto

luke_parham Punkte 141

Ich weiß, dass diese Frage schon sehr alt ist, aber für den Fall, dass noch jemand auf der Suche nach einer Antwort ist, hier eine Alternative.

Das Schöne an dieser Version ist, dass man eine Abschlussanimation genau dann ausführen kann, wenn die erste abgeschlossen ist, anstatt sie in der Callback-Methode zu erraten/zu kodieren, da diese sofort aufgerufen wird.

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

oder einfach

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

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X