Das Problem beim Aufrufen selectAnnotationvon - (void)mapViewDidFinishLoadingMap:(MKMapView *)mapViewbesteht darin, dass dieses Ereignis, wie der Name schon sagt, erst ausgelöst wird, wenn MapView zum ersten Mal geladen wird. Sie können das Callout der Anmerkung also nicht auslösen, wenn Sie es hinzufügen, nachdem MapView vollständig geladen wurde.
Das Problem beim Aufrufen von - (void)mapView:(MKMapView *)mapView didAddAnnotationViews:(NSArray *)viewsist, dass Ihre Anmerkung möglicherweise nicht auf dem Bildschirm angezeigt wird, wenn sie selectAnnotationaufgerufen wird, was dazu führen würde, dass sie keine Auswirkung hat. Selbst wenn Sie die Region Ihres MapView vor dem Hinzufügen der Anmerkung auf die Koordinate der Anmerkung zentrieren, reicht die geringfügige Verzögerung zum Festlegen der Region der MapView aus selectAnnotation, um aufgerufen zu werden, bevor die Anmerkung auf dem Bildschirm angezeigt wird, insbesondere wenn Sie animieren setRegion.
Einige Leute haben dieses Problem gelöst, indem sie selectAnnotationnach einer Verzögerung als solche angerufen haben :
-(void)mapView:(MKMapView *)mapView didAddAnnotationViews:(NSArray *)views {
[self performSelector:@selector(selectLastAnnotation)
withObject:nil afterDelay:1];
}
-(void)selectLastAnnotation {
[myMapView selectAnnotation:
[[myMapView annotations] lastObject] animated:YES];
}
Aber selbst dann können seltsame Ergebnisse erzielt werden, da es mehr als eine Sekunde dauern kann, bis die Anmerkung auf dem Bildschirm angezeigt wird. Dies hängt von verschiedenen Faktoren ab, z. B. der Entfernung zwischen der Region Ihres vorherigen MapView und der neuen Region oder der Geschwindigkeit Ihrer Internetverbindung.
Ich habe mich - (void)mapView:(MKMapView *)mapView regionDidChangeAnimated:(BOOL)animatedstattdessen für den Anruf entschieden, da dadurch sichergestellt wird, dass die Anmerkung tatsächlich auf dem Bildschirm angezeigt wird (vorausgesetzt, Sie setzen die Region Ihres MapView auf die Koordinate Ihrer Anmerkung), da dieses Ereignis nach Abschluss setRegion (und seiner Animation) ausgelöst wird. Allerdings wird regionDidChangeAnimatedausgelöst, wenn Ihre MapView der Region ändert, auch wenn der Benutzer schwenkt gleich um die Karte , so dass Sie sicher, müssen Sie eine Bedingung, um richtig zu identifizieren , wenn der richtige Zeitpunkt ist die Anmerkung des callout auszulösen.
So habe ich es gemacht:
MKPointAnnotation *myAnnotationWithCallout;
- (void)someMethod {
MKPointAnnotation *myAnnotation = [[MKPointAnnotation alloc] init];
[myAnnotation setCoordinate: someCoordinate];
[myAnnotation setTitle: someTitle];
MKCoordinateRegion someRegion =
MKCoordinateRegionMakeWithDistance (someCoordinate, zoomLevel, zoomLevel);
myAnnotationWithCallout = myAnnotation;
[myMapView setRegion: someRegion animated: YES];
[myMapView addAnnotation: myAnnotation];
}
- (void)mapView:(MKMapView *)mapView regionDidChangeAnimated:(BOOL)animated
{
if (myAnnotationWithCallout)
{
[mapView selectAnnotation: myAnnotationWithCallout animated:YES];
myAnnotationWithCallout = nil;
}
}
Auf diese Weise wird Ihre Anmerkung im Moment garantiert auf dem Bildschirm angezeigt selectAnnotation des Aufrufs wird, und der if (myAnnotationWithCallout)Teil stellt sicher, dass keine andere - (void)someMethodRegionseinstellung als die in das Callout auslöst.