2013-01-02 23 views
1

我有一個包含大量註釋(8000+)的MapView。在所有註釋都可見的情況下,通過滾動地圖來降低性能。所以,當我在可見區域時,我有想法隱藏一些註釋。我在論壇中發現了this thread,但它不能解決我的問題。如何管理大量的MapViewAnnotations

我試圖通過編寫這段代碼

- (void)mapView:(MKMapView *)_mapView regionDidChangeAnimated:(BOOL)animated 
{ 
    NSSet *annoSet = [[NSSet alloc] initWithSet:[_mapView annotationsInMapRect:_mapView.visibleMapRect]]; 
    NSMutableSet *annotationsSet = (NSMutableSet *)annoSet; 

    NSLog(@"Annos: %i", [annotationsSet count]); 

    if([annotationsSet count]>500) 
    { 
     for(MapViewAnnotation* annotation in annotationsSet) 
     { 
      [[_mapView viewForAnnotation:annotation] setHidden:YES]; 
     } 
    } 
} 

這工作另一種解決方案,但手術後的MapView是全部癱瘓近,我有什麼可以改善?

編輯:

我的新代碼如下所示:

- (void)mapView:(MKMapView *)_mapView regionDidChangeAnimated:(BOOL)animated 
{ 
    NSSet *annoSet = [[NSSet alloc] initWithSet:[_mapView annotationsInMapRect:_mapView.visibleMapRect]]; 
    //NSMutableSet *annotationsSet = (NSMutableSet *)annoSet; 

    NSLog(@"Annos: %i", [annoSet count]); 

    if([annoSet count]>500) 
    { 
     for(MapViewAnnotation* annotation in annoSet) 
     { 
      [[_mapView viewForAnnotation:annotation] setHidden:YES]; 
     } 

    } 
    else if([annoSet count] <= 500) 
    { 
     for(MapViewAnnotation* annotation in annoSet) 
     { 
      [[_mapView viewForAnnotation:annotation] setHidden:NO]; 
     } 

    } 
} 

,但我不希望隱藏在的visibleRect只是其中的所有註釋。 任何想法我怎麼能以有效的方式做到這一點?

+0

我測試了我的代碼幾次,我幾乎可以確定我的MapView不是靠近故障。我想那樣,因爲我不能滾動它。滾動被阻止的原因是,我在無形註釋上點擊了太長的時間,以至於標註泡泡出現,並且在此狀態下無法滾動地圖 – user1895268

回答

3

您正在尋找的是一種對您的註釋進行聚類的方式,這意味着在靠近幾個註釋處顯示單個註釋。如果你想做得對,這會變得有點複雜,但是如果你搜索網絡,你會發現幾個討論聚類策略和算法的地方。我已經鏈接到下面的一些。

的Applidium團隊網站上This blog post討論這樣一個戰略,現在有幾個項目在Github上(mapkit-clusterskingpinRevClusterMap),可以照顧集羣的爲您服務。如果沒有別的,看看代碼,你會知道如何處理這個問題。然而,當我的團隊研究這個問題時,我們採用了其中一個WWDC視頻中描述的解決方案(this one,我認爲(需要開發人員帳戶)),我們對此進行了一些修改以提高性能。

請注意,您可能必須找到一種讓用戶知道何時單擊聚集註釋的方法。我們用一個自定義標註來完成此操作,該標註列出了由該單個註釋表示的所有註釋。

+0

如果您正在尋找主引腳,您可以在此處找到它:http:/ /itsbonczek.github.com/kingpin/ –