2011-06-16 56 views
2

我想每5秒更新一次mapview上某些註釋的圖像,但是我不想刪除並重新添加到地圖中,因爲這會導致它們「閃爍」或刷新,(即disapear然後重新出現)。我希望它是無縫的。在不閃爍的情況下更新MKannotation圖像

我已經試過如下:

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

這樣一想,如果我加在上面的新圖標然後我可以刪除舊的圖標,但仍引起了閃爍。

有沒有人有任何想法?

回答

8

在註釋不爲零,而不是添加和刪除的情況下,試試這個:

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

哇!完美的,非常感謝你,我以爲我不能夠做到這一點,不知道這種觀點ForFornotation方法 - 非常方便。 – RodH257 2011-06-16 17:55:12

+0

請記住,如果您使用委託方法mapView:viewForAnnotation:with reusableIdentifiers,它可以重用您剛更改圖像的視圖。 – Toydor 2014-06-01 08:17:42

+0

@Toydor,是的。在viewForAnnotation方法中,它應該具有根據註釋當前狀態設置圖像的邏輯(無論導致您更新圖像的狀態)。 – Anna 2014-06-01 14:47:24

-1

看來你使用的是自己的自定義視圖的註釋,在這種情況下,你可以簡單地添加在自定義視圖中使用「刷新」方法,並在更新底層註釋後調用它(即:自定義視圖 - 來自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]; 
} 
0

安娜回答斯威夫特版本:

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