Обновите заголовок / подзаголовок для пользовательской аннотации в MKMapView - PullRequest
2 голосов
/ 23 июля 2010

Я создал собственную аннотацию для отображения моих данных. Данные поступают с движущихся транспортных средств, и мне нужно обновить их местоположение на карте, а также их название (оно показывает время последнего обновления).

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

В OS4 SDK они улучшили MKMapViewAnnotation, и теперь я могу установить координаты (раньше они были только для чтения). Изменение координат перемещает вид, где он должен быть без мерцания. Это решило одну из моих проблем.

В документации API сказано, что изменение названия MKAnnotation приведет к обновлению MKAnnotationView. Это действительно так для MKPinView. Если я обновлю координаты и заголовок MKAnnotation, штифт переместится и покажет новые данные.

Как я могу добиться того же результата, используя свой пользовательский MKAnnotationView? Я не вижу способа попросить обновить представление. Я попытался вызвать setNeedsLayout на MKAnnotationView, но это привело только к исчезновению вида.

Приветствие.

Ответы [ 2 ]

3 голосов
/ 23 февраля 2012

MKMapView использует KVO для наблюдения изменений в свойствах title и subtitle. Самый простой способ убедиться, что представление карты замечает ваши изменения, состоит в том, чтобы присвоить им свойства и использовать методы setTitle: / setSubtitle: (или self.title = @"..."; - обратите внимание, что требуется обозначение self.):

CustomAnnotation.h

@property (nonatomic, copy) NSString *title;
@property (nonatomic, copy) NSString *subtitle;

- (void)changeAnnotation;

CustomAnnotation.m

@synthesize title, subtitle;

- (void)changeAnnotation {
    self.title = @"New title!";
    [self setSubtitle:@"New subtitle!"];
}

Синтезированные установщики свойств справляются с трудностями наблюдения значения ключа для вас. В противном случае вам придется самостоятельно звонить willChangeValueForKey: и didChangeValueForKey:; они реализованы в NSObject:

[self willChangeValueForKey:@"title"];
[title release];
title = @"New title.";
[self didChangeValueForKey:@"title"];
0 голосов
/ 05 октября 2010

Пробовал setNeedsDisplay?

...