Перемещение аннотаций в MKMapView в соответствии с данными сервера (широта и долгота) - PullRequest
4 голосов
/ 05 марта 2012

В моем приложении я показываю местоположение другого человека, получая его местоположение (широту и долготу) с сервера через определенный интервал.

После получения мне нужно удалить все аннотации и удалить новые аннотации на основе данных сервера.

Но это выглядит очень неэффективно, поскольку, когда у нас есть аннотация для того же пользователя, ранее существовала, даже тогда я удаляю и добавляю ту же аннотацию пользователя.

Итак, я хочу знать, можем ли мы переместить примечание MKA из одной координаты в другую?Я пробовал свойство "setCoordinate", но не смог успешно его реализовать.

Кроме того, это не "коснуться и перетащить" вид.Аннотации перемещаются, когда приложение получает данные (широта и долгота) с сервера.

Ответы [ 2 ]

3 голосов
/ 07 марта 2012

Чтобы изменить координату аннотации, не удаляя, заново создавая и добавляя ее снова, создайте класс аннотации, в котором можно установить свойство coordinate.Простой способ сделать это - определить свойство coordinate следующим образом:

@property (nonatomic, assign) CLLocationCoordinate2D coordinate;

В качестве альтернативы, вместо определения вашего собственного класса, вы также можете использовать встроенный класс MKPointAnnotation, который имеетsettable coordinate.

Вы изначально создаете и добавляете аннотации как обычно.Например:

MKPointAnnotation *pa = [[MKPointAnnotation alloc] init];
pa.coordinate = someCoordinate;
pa.title = @"User1";
[mapView addAnnotation:pa];
[pa release];

Позже, когда вы получите обновление от сервера и измените координаты для «User1», вы можете либо найти аннотацию этого пользователя в массиве annotations представления карты, либо сохранитьссылки на аннотации в некоторой другой структуре, которая обеспечивает быстрый доступ с использованием ключа, такого как NSMutableDictionary.

После того, как вы нашли аннотацию, вы просто устанавливаете свойство coordinate аннотации на новое значение и картуview автоматически переместит вид аннотации на новое место.

В этом примере выполняется поиск в массиве annotations:

for (id<MKAnnotation> ann in mapView.annotations)
{
    if ([ann.title isEqualToString:@"User1"])
    {
        ann.coordinate = theNewCoordinate;
        break;
    }
}

Если вы хотите найти аннотацию, используя другое, настраиваемое свойство вашего класса аннотаций (например, некоторый int с именем userIdNumber):

for (id<MKAnnotation> ann in mapView.annotations)
{
    if ([ann isKindOfClass:[YourAnnotationClass class]])
    {
        YourAnnotationClass *yacAnn = (YourAnnotationClass *)ann;
        if (yacAnn.userIdNumber == user1Id)
        {
            yacAnn.coordinate = theNewCoordinate;
            break;
        }
    }
}

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

0 голосов
/ 05 марта 2012

Почему это проблема с производительностью? Вы измерили это? Вы просто меняете массив объектов, даже не создавая новые экземпляры.

AnnotationViews на MapView будут все равно использоваться повторно. С этим не должно быть проблем.

...