Обновление изображения MKannotation без перепрошивки - PullRequest
2 голосов
/ 16 июня 2011

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

Я пробовал следующее:

//get the current icon
        UserAnnotation *annotation = [self GetUserIconWithDeviceId:deviceId];

        //make a new annotation for it 
        UserAnnotation *newAnnotation = [[UserAnnotation alloc]
                                         initWithCoordinate: userCoordinates
                                         addressDictionary:nil];
        newAnnotation.title = name;
        newAnnotation.userDeviceId = deviceId;
        NSInteger ageIndicator = [[userLocation objectForKey: @"ageIndicator"] integerValue];
        newAnnotation.customImage = [UserIconHelpers imageWithAgeBorder:ageIndicator FromImage: userImage];



        //if its not there, add it 
        if (annotation != nil){
            //move it 

            //update location
            annotation.coordinate = userCoordinates;

            //add new one 
            [self.mapView addAnnotation: newAnnotation];

            //delete old one 
            [self.mapView removeAnnotation: annotation];

        } else {
        //just addd the new one 
            [self.mapView addAnnotation: newAnnotation]; 
        }

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

У кого-нибудь есть идеи?

Ответы [ 3 ]

8 голосов
/ 16 июня 2011

В случае, когда аннотация не равна нулю, вместо добавления и удаления попробуйте следующее:

annotation.customImage = ... //the new image
MKAnnotationView *av = [self.mapView viewForAnnotation:annotation];
av.image = annotation.customImage;
1 голос
/ 14 января 2016

Свифт версия Анны, ответ:

annotation.customImage = ... //the new image
let av = self.mapView.viewForAnnotation(dnwl!)
av?.image = annotation.customImage
0 голосов
/ 09 октября 2013

Похоже, что вы используете свои собственные пользовательские представления для аннотаций, в этом случае вы можете просто добавить метод "refresh" в свое пользовательское представление и вызвать его после обновления базовой аннотации (то есть: пользовательское представление -aпроизводный класс от MKAnnotationView - всегда присоединен к потенциально настраиваемому классу «аннотаций», соответствующему протоколу MKAnnotation) *

*) CustomAnnotationView.h

@interface CustomAnnotationView : MKAnnotationView
{
    ...
}
...

//tell the view to re-read the annotation data it is attached to
- (void)refresh;

*) CustomAnnotationView.m

//override super class method
- (void)setAnnotation:(id <MKAnnotation>)annotation
{
    [super setAnnotation:annotation];
    ...
    [self refresh];
}
- (void)refresh
{
    ...
    [self setNeedsDisplay]; //if necessary
}

*) Где вы обрабатываете MKMapView и его аннотации

for(CustomAnnotation *annotation in [m_MapView annotations])
{
    CustomAnnotationView *annotationView = [m_MapView viewForAnnotation:annotation];
    [annotationView refresh];
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...