2012-03-05 45 views
4

在我的應用程序中,我通過以特定間隔從服務器獲取其位置(經度和緯度)來顯示其他人的位置。根據服務器數據(經度和緯度)在MKMapView中移動註釋

獲得後,我必須刪除所有註釋,並根據服務器數據刪除新的註釋。

但它看起來效率非常低,因爲當我們爲先前存在的同一用戶註釋時,即使這樣我也會刪除並添加相同的用戶註釋。

所以我想知道我們是否可以將MKAnnotation從一個座標移動到另一個座標?我嘗試過「setCoordinate」財產,但無法成功實施它。

另外它不是「觸摸和拖動」的那種。當應用程序從服務器獲取數據(經度和緯度)時,註釋會自行移動。

+0

請詳細解釋爲何setCoordinate沒有工作(編譯錯誤,警告,運行時錯誤和崩潰,等)。顯示註釋類.h和.m。不明白你最後一段的意思(「不要觸摸和拖動類...」)。 – Anna 2012-03-05 13:08:59

+0

其實我不知道如何訪問MKMapView中的MKAnnotation對象(除了「viewForAnnotation:(id )註釋」)之外的任何地方..我試過.... NSArray * pinGreen = [[NSArray alloc] initWithArray:[self。 mapView註釋]]; \t的for(int i = 0; I <[pinGreen計數];我++){ \t \t如果([[pinGreen objectAtIndex:ⅰ] isKindOfClass:[MapViewAnnotation類]]) \t \t { \t \t \t \t \t \t [self.mapView removeAnnotation:[pinGreen objectAtIndex:i]]; \t \t \t \t \t \t \t} \t \t \t \t \t} ......但是這給 「MapViewAnnotation」 類型的對象不是 「MKAnnotation」 和setCoordinate它需要爲[someAnnotation setCoordinate:cordinate ] – 2012-03-06 07:29:00

+0

你的結論是「不可能」是不正確的。當然,您可以直接或間接使用註釋上的setCoordinate來移動註釋視圖。 – Anna 2012-03-06 13:22:23

回答

0

爲什麼這是一個性能問題?你有沒有上過網嗎? 你只是改變了一個對象數組,甚至沒有創建新的實例。

無論如何,MapView上的AnnotationViews將被重新使用。這不應該有任何問題。

+0

是的,你是對的,它們被重用。但是最好將位置改變的位置移動然後移除並重新繪製(實際上是我的客戶要求)。所以我想移動它們而不是爲同一個用戶移除和重畫。 – 2012-03-06 07:24:23

+0

好的..謝謝...這意味着它是不可能自己移動MKAnnotation的意見 – 2012-03-06 12:05:44

3

要更改標註的座標不刪除,重新創建和重新加入,創建一個註解類,其中coordinate屬性設定。一個簡單的方法來做到這一點是確定coordinate屬性是這樣的:

@property (nonatomic, assign) CLLocationCoordinate2D coordinate; 

或者,而不是定義自己的類,你還可以使用內置的MKPointAnnotation類具有可設置coordinate

您最初創建並添加註釋照常。例如:

MKPointAnnotation *pa = [[MKPointAnnotation alloc] init]; 
pa.coordinate = someCoordinate; 
pa.title = @"User1"; 
[mapView addAnnotation:pa]; 
[pa release]; 

後來,當你從服務器的更新,併爲「用戶1」變化的座標,您可以搜索該用戶的地圖視圖的annotations陣列中的註解或存儲到註釋中引用在一些其他結構中,允許使用諸如NSMutableDictionary之類的鍵快速訪問。

找到註釋後,只需將註釋的coordinate屬性設置爲新值,地圖視圖就會自動將註釋視圖移動到新位置。

此示例搜索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; 
     } 
    } 
} 

以上只是如何改變座標的一個例子。如果您在座標變化時有很多註釋,我不建議一次一個地搜索它們。相反,您可以將引用存儲在字典中,並使用鍵值快速查找它們。

相關問題