Адам
Это решение немного грязное, так как мне пришлось тестировать один из моих текущих проектов для тестирования, но, надеюсь, это сработает для вас.
Сначала объяснение, важно отделить данные от представления пользовательского интерфейса. [MKMapView addAnnotation (s)] - это просто обновление данных в MKMapView, которое не оказывает прямого влияния на анимацию или синхронизацию.
Метод делегата mapView: didAddAnnotationViews: это место, где должно быть определено все пользовательское поведение представления. В вашем описании вы не хотели, чтобы они появлялись сразу, поэтому вам нужно чередовать анимации, а не выполнять их одновременно.
Один метод состоит в том, чтобы добавить все аннотации одновременно, а затем просто добавить их с увеличением задержек анимации, однако новые аннотации, которые добавляются по какой-либо причине, снова начнут свою анимацию с нуля.
Приведенный ниже метод настраивает очередь анимации self.pendingViewsForAnimation (NSMutableArray) для хранения представлений аннотаций по мере их добавления, а затем последовательно связывает анимацию.
Я заменил рамочную анимацию альфой, чтобы сосредоточиться на проблеме анимации, чтобы отделить ее от проблемы некоторых элементов, которые не отображаются. Подробнее об этом после кода ...
// Interface
// ...
// Add property or iVar for pendingViewsForAnimation; you must init/dealloc the array
@property (retain) NSMutableArray* pendingViewsForAnimation;
// Implementation
// ...
- (void)processPendingViewsForAnimation
{
static BOOL runningAnimations = NO;
// Nothing to animate, exit
if ([self.pendingViewsForAnimation count]==0) return;
// Already animating, exit
if (runningAnimations)
return;
// We're animating
runningAnimations = YES;
MKAnnotationView* view = [self.pendingViewsForAnimation lastObject];
[UIView animateWithDuration:0.4 animations:^(void) {
view.alpha = 1;
NSLog(@"Show Annotation[%d] %@",[self.pendingViewsForAnimation count],view);
} completion:^(BOOL finished) {
[self.pendingViewsForAnimation removeObject:view];
runningAnimations = NO;
[self processPendingViewsForAnimation];
}];
}
// This just demonstrates the animation logic, I've removed the "frame" animation for now
// to focus our attention on just the animation.
- (void) mapView:(MKMapView *)mapV didAddAnnotationViews:(NSArray *)views {
for (MKAnnotationView *view in views) {
view.alpha = 0;
[self.pendingViewsForAnimation addObject:view];
}
[self processPendingViewsForAnimation];
}
Что касается вашей второй проблемы, предметы не всегда появляются, пока вы не переместите карту. Я не вижу явных ошибок в вашем коде, но вот несколько вещей, которые я хотел бы сделать, чтобы изолировать проблему:
- Временно удалите свой mapView: didAddAnnotationViews :, mapView: annotationForView: и любые другие пользовательские поведения, чтобы увидеть, работает ли поведение по умолчанию.
- Убедитесь, что у вас есть действительная аннотация при вызове addAnnotation: и что координаты видимы (используйте [mapView visibleMapRect], MKMapRectContainsPoint () и MKMapPointForCoordinate ().
- Если он все еще не работает, посмотрите, откуда вы вызываете код добавления аннотаций. Я стараюсь избегать вызовов аннотаций во время движения карты, используя executeSelector: withObject: afterDelay. Вы можете добавить к этому [NSObject cancelPreviousPerformRequestsWithTarget: selector: object:], чтобы создать небольшую задержку перед загрузкой аннотаций в случае, если карта перемещается на большое расстояние несколькими пальцами.
И еще одно замечание: для достижения необходимого эффекта закрепления булавки вы, вероятно, захотите сместить его на фиксированное расстояние от исходного объекта вместо зависимости от annotationVisibleRect. Ваша текущая реализация приведет к тому, что штифты будут двигаться с разными скоростями в зависимости от их расстояния от края. Элементы в верхней части будут медленно перемещаться на место, в то время как элементы в нижней части будут быстро летать на свои места. Анимация Apple по умолчанию всегда падает с одной высоты. Вот пример: Как я могу создать собственную анимацию с помощью MKAnnotationView?
Надеюсь, это поможет.
Обновление:
Чтобы продемонстрировать этот код в действии, я прикрепил ссылку на модифицированную версию демонстрации Apple Seismic со следующими изменениями:
- Изменен Earthquake.h / m на объект MKAnnotation
- Добавлен SeismicMapViewController.h / m с кодом выше
- Обновлен RootViewController.h / m, чтобы открыть вид карты как модальную страницу
См .: http://dl.dropbox.com/u/36171337/SeismicXMLWithMapDelay.zip