2014-12-26 69 views
5

我們如何確保註釋視圖以指定的順序/位置放置在地圖上?處理重疊的MKAnnotationView

我有一個情況,一個地址可以有多個註釋(在彼此之上)。例如,引腳編號1,2,3和4位於相同的地理位置。當地圖加載時,我希望Pin#1位於頂部,但無法確保Pin#1始終可見(位於頂部)。

環顧四周我找到了以下解決方案,但這些解決方案都不適合我。

1)。按照您想要的順序將註釋添加到地圖中。

根據我的經驗,這是行不通的!根據我的經驗,使用addAnnotations:一起添加註釋或逐個添加註釋會生成相同的結果。註釋視圖的順序仍然是隨機的。

[self.mapView addAnnotations:allAnnotations]; 

產生相同的結果:

for (MyCustomAnnotation *annotation in allAnnotations) { 
    [self.mapView addAnnotation:annotation]; 
} 

2)。使用bringSubviewToFront或sendSubviewToBack指定所有註釋的順序。

根據我的經驗,這是行不通的!例如,下面的代碼不會產生所要求的結果:

- (void)mapView:(MKMapView *)mapView didAddAnnotationViews:(NSArray *)views { 
    // .tag associated with each view specifies the order/hierarchy of annotation views 
    NSSortDescriptor *sortDescriptor = [[NSSortDescriptor alloc] initWithKey:@"tag" ascending:YES]; 
    NSArray *orderedAnnotationViews = [views sortedArrayUsingDescriptors:[NSArray arrayWithObject:sortDescriptor]]; 

    for (MKAnnotationView *annotationView in orderedAnnotationViews) { 
     [mapView sendSubviewToBack:annotationView]; 
    } 
} 

3)。使用annotationView.layer.zPosition指定所有註釋的確切順序。

考慮一種情況,其中4個引腳重疊,例如,引腳1,2,3和4.這種方法的問題在於,敲擊特定的註釋引腳或以編程方式選擇它並不會將其帶到前面。 zPosition是絕對的。每次選擇一個引腳時都可以更改它,但這並不理想。

zPosition屬性指定圖層的 位置的z軸組件。 zPosition旨在用於設置圖層相對於其兄弟圖層的視覺位置。不應該是 用於指定層同胞的順序,而是重新排序子層數組中的層 。

想法?

+0

註釋的順序在點擊它們時發生更改。我的意思是對於註解組中的每個點擊,地圖將顯示不在頂部的註釋。是的註釋順序沒有解決。這裏的實驗很好。 – Kampai

回答

4

我結束了zPosition工作:

- (void)mapView:(MKMapView *)mapView didAddAnnotationViews:(NSArray *)views { 
    NSSortDescriptor *sortDescriptor = [[NSSortDescriptor alloc] initWithKey:@"tag" ascending:NO]; 
    NSArray *sortedViews = [views sortedArrayUsingDescriptors:[NSArray arrayWithObject:sortDescriptor]]; 

    // Set zPosition 
    for (MKAnnotationView *annotationView in sortedViews) { 
     annotationView.layer.zPosition = ++_zPositionForAnnotationViews; 
    } 

    // Do whatever 
    // . . . 
} 

- (void)mapView:(MKMapView *)aMapView didSelectAnnotationView:(MKAnnotationView *)view { 
    NSLog(@"The annotation tapped is: %@", view.annotation.title); 

    // Ignore tap on user location 
    if ([view.annotation isKindOfClass:[MKUserLocation class]]) { 
     return; 
    } 

    // Update zPosition (to bring it to front) 
    view.layer.zPosition = ++_zPositionForAnnotationViews; 

    // Do whatever 
    // . . . 
} 

_zPositionForAnnotationViews是一個類變量。

+0

爲什麼不在didAddAnnotationViews中爲annotationView.layer.zPosition設置一些大數字:?而不是迭代刪除所有視圖? – daleijn