Чтобы изменить координату аннотации, не удаляя, заново создавая и добавляя ее снова, создайте класс аннотации, в котором можно установить свойство 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;
}
}
}
Выше приведен пример того, как изменить координату.Если у вас много аннотаций с изменяющимися координатами, я не рекомендую искать их по одному.Вместо этого вы можете хранить ссылки в словаре и быстро искать их, используя значение ключа.