Updating MKannotation image without flashing

陌路散爱 提交于 2020-01-01 00:47:09

问题


I want to update the images of some of my annotations on a mapview every 5 seconds, however I dont' want to remove and re-add them to the map as this causes them to 'flash' or refresh, (ie disapear then reappear). I want it to be seamless.

I've tried the following:

//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]; 
        }

as a thought that if I added the new icon on top I could then remove the old icon, but this still caused the flashing.

Has anyone got any ideas?


回答1:


In the case where the annotation is not nil, instead of adding and removing, try this:

annotation.customImage = ... //the new image
MKAnnotationView *av = [self.mapView viewForAnnotation:annotation];
av.image = annotation.customImage;



回答2:


Swift version of Anna answer:

annotation.customImage = ... //the new image
let av = self.mapView.viewForAnnotation(dnwl!)
av?.image = annotation.customImage



回答3:


It seems you are using your own custom views for the annotations, in that case you can simply add a "refresh" method to your custom view and call it after you have updated the underlying annotation (ie: a custom view -a derived class from MKAnnotationView- is always attached to a potentially custom "annotation" class that conforms to the MKAnnotation protocol)

*) 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
}

*) Where you handle the MKMapView and its annotations

for(CustomAnnotation *annotation in [m_MapView annotations])
{
    CustomAnnotationView *annotationView = [m_MapView viewForAnnotation:annotation];
    [annotationView refresh];
}


来源:https://stackoverflow.com/questions/6375473/updating-mkannotation-image-without-flashing

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!