MKMapView, animateDrop?

Я установил NSMutableArray объектов, полученных из класса, который соответствует протоколу MKAnnotation. У меня есть заголовок установки и субтитры для аннотации и успешно добавлены в MKMapView, используя:

[[self customMapView] addAnnotations:locationArray];

То, что я хочу сделать сейчас, - это оживить выпадение булавок, изначально я думал, что могу сделать это с помощью Option1, используя все это работает, но булавки не делают анимированное падение.

// Option1
// WORKS FOR: pinColor YES, animatesDrop NO, LABEL YES
- (void)mapView:(MKMapView *)mapView didAddAnnotationViews:(NSArray *)views {
    for(MKPinAnnotationView *eachView in views) {
        [eachView setAnimatesDrop:YES];
        [eachView setPinColor:MKPinAnnotationColorPurple];
    }
}

Мое следующее предположение состояло в том, чтобы попробовать Option2, это работает очень хорошо, но у меня есть две проблемы. Заголовок и субтитры не отображаются, мой пользовательский объект аннотации передается (я вижу его в отладчике), но содержащаяся информация не переводит его в новый pin. Во-вторых, это создает новый набор MKAnnotationViews, что происходит со старыми, есть и проблемы с утечками памяти?

// Option2
//FOR: pinColor YES, animatesDrop YES, LABEL NO
- (MKAnnotationView *) mapView: (MKMapView *) mapView viewForAnnotation: (id<MKAnnotation>) annotation {
    MKPinAnnotationView *pin = (MKPinAnnotationView *) [mapView dequeueReusableAnnotationViewWithIdentifier: @"annotation_ID"];
    if (pin == nil) {
        pin = [[[MKPinAnnotationView alloc] initWithAnnotation: annotation reuseIdentifier: @"annotation_ID"] autorelease];
    } else {
        pin.annotation = annotation;
    }
    pin.pinColor = MKPinAnnotationColorRed;
    pin.animatesDrop = YES;
    return pin;
}

EDIT: я решил пропустить заголовок и subTitle, добавив pin.canShowCallout = YES;

Ответы

Ответ 1

MKPinAnnotationView является подклассом MKAnnotationView.

MKAnnotationView - это общий аннотационный вид, для которого вы должны предоставить изображение и анимацию, если хотите.

MKPinAnnotationView является удобным подклассом MKAnnotationView, который автоматически обеспечивает выводное изображение в выбранном цвете и анимацию вывода булавки на карту. Вы устанавливаете свойство animatesDrop при создании представления в viewForAnnotation, и оно будет обрабатывать анимацию автоматически оттуда.

Если вы не реализуете viewForAnnotation, отображается стандартный красный вывод без анимации.

К тому времени, когда вызывается adAdAnnotationViews, автоматическая анимация уже произошла и установка этого свойства не имеет эффекта.

Если вы хотите создать настраиваемую анимацию, отличную от анимации dropdown по умолчанию, которую предоставляет MKPinAnnotationView, вы можете сделать это в didAddAnnotationViews. Представление уже будет в конечной точке назначения, поэтому вы сохраните его, а затем оставьте его с другой точки в этом пункте назначения.

Если вы довольны анимацией dropdown по умолчанию, которую предоставляет MKPinAnnotationView, вам не нужно реализовывать didAddAnnotationViews. Этот метод делегата более полезен для выполнения других действий, которые вам могут понадобиться, когда все представления аннотаций действительно находятся на месте.

Чтобы ваши контакты отображали заголовок, установите canShowCallout в YES, где вы установили animatesDrop.

Не уверен, что вы подразумеваете под этим "это создает новый набор MKAnnotationViews". В методе viewForAnnotation вы предоставляете представление (MKPinAnnotationView) для объекта MKAnnotation. Это не одно и то же.

Кроме того, метод viewForAnnotation работает подобно методу cellForRowAtIndexPath для UITableView, где аннотация views может быть переработана, поэтому важно, чтобы каждый раз задавать определенную информацию MKAnnotation в представлении (например, свойство аннотации).

Ответ 2

Вот самое простое решение, которое я мог найти. Что он делает, это сброс одного вывода в UIMapView в событии viewDidLoad.

  • Ссылка на проект MapKit framework

  • Вид имеет следующий импорт: #import <MapKit/MapKit.h>

  • Контроллер представления реализует протокол MKMapViewDelegate

  • Реализация контроллера представления содержит:

- (MKAnnotationView *) mapView:(MKMapView *)mapView viewForAnnotation:(id ) annotation
{
    MKPinAnnotationView *newAnnotation = [[MKPinAnnotationView alloc] initWithAnnotation:annotation reuseIdentifier:@"annotation1"];
    newAnnotation.pinColor = MKPinAnnotationColorGreen;
    newAnnotation.animatesDrop = YES; 
    newAnnotation.canShowCallout = NO;
    [newAnnotation setSelected:YES animated:YES]; 
    return newAnnotation;
}
  • В viewDidLoad содержатся:
CLLocationCoordinate2D geos = CLLocationCoordinate2DMake(0.2344, 45.324);
MKPlacemark* marker = [[MKPlacemark alloc] initWithCoordinate:geos addressDictionary:nil];
[mapView addAnnotation:marker];
[marker release];

Ответ 3

Обновить Swift3:

 func mapView(_ mapView: MKMapView, viewFor annotation: MKAnnotation) -> MKAnnotationView? {

  if annotation is MKUserLocation {
     return nil
  }

  let pinAnnotation = MKPinAnnotationView(annotation: annotation, reuseIdentifier: "PinAnnotation")
  pinAnnotation.pinTintColor = .green;
  pinAnnotation.animatesDrop = true;
  pinAnnotation.canShowCallout = false;
  pinAnnotation.setSelected(true, animated: true)

  return pinAnnotation
}