Проблема із дзвінком selectAnnotationз- (void)mapViewDidFinishLoadingMap:(MKMapView *)mapView полягає в тому, що, як випливає з назви, ця подія запускається лише після того, як ваш MapView завантажується спочатку, тому ви не зможете активувати додаткову інформацію анотації, якщо ви додасте її після завершення завантаження MapView.
Проблема із його викликом - (void)mapView:(MKMapView *)mapView didAddAnnotationViews:(NSArray *)viewsполягає в тому, що ваша анотація може не відображатися на екрані при виклику , що не selectAnnotationпризведе до її ефекту. Навіть якщо ви відцентруєте область MapView до координати анотації перед додаванням анотації, невеликої затримки, необхідної для встановлення області MapView, достатньо, selectAnnotationщоб її було викликано до того, як анотація з’явиться на екрані, особливо якщо ви анімуєте setRegion.
Деякі люди вирішили цю проблему, зателефонувавши selectAnnotationпісля затримки:
-(void)mapView:(MKMapView *)mapView didAddAnnotationViews:(NSArray *)views {
[self performSelector:@selector(selectLastAnnotation)
withObject:nil afterDelay:1];
}
-(void)selectLastAnnotation {
[myMapView selectAnnotation:
[[myMapView annotations] lastObject] animated:YES];
}
Але навіть тоді ви можете отримати дивні результати, оскільки може знадобитися більше однієї секунди, щоб анотація з’явилася на екрані, залежно від різних факторів, таких як відстань між попереднім регіоном MapView та новим, або швидкістю підключення до Інтернету.
- (void)mapView:(MKMapView *)mapView regionDidChangeAnimated:(BOOL)animatedНатомість я вирішив здійснити виклик, оскільки він гарантує, що анотація насправді знаходиться на екрані (за умови, що ви встановили для регіону MapView координату анотації), оскільки ця подія запускається після завершення setRegion (та його анімації). Однак regionDidChangeAnimatedспрацьовує щоразу, коли регіон вашого MapView змінюється, зокрема, коли користувач просто прокручує карту, тому вам потрібно переконатися, що у вас є умова, щоб правильно визначити, коли саме час для запуску додаткової виноски анотації.
Ось як я це зробив:
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;
}
}
Таким чином ваша анотація гарантовано відображатиметься на екрані в той момент, коли selectAnnotationбуде викликано, а if (myAnnotationWithCallout)частина гарантує, що жодна установка регіону, крім тієї, що - (void)someMethodбуде, не ініціюватиме додаткову інформацію.