2014-12-26 13 views
5

Come possiamo garantire che le viste di annotazione siano posizionate in un ordine/posizione specificato sulla mappa?Gestione sovrapposizione MKAnnotationView (s)

Ho un caso in cui un singolo indirizzo può avere più annotazioni (una sopra l'altra). Ad esempio, i numeri PIN 1, 2, 3 e 4 sono posizionati nella stessa posizione geografica. Quando viene caricata la mappa, voglio che il Pin # 1 sia in cima, ma non c'è modo di garantire che il Pin # 1 sia sempre visibile (in alto).

Guardandomi intorno ho trovato le seguenti soluzioni, ma nessuna di queste ha funzionato per me.

1). Aggiungi le annotazioni alla mappa, nell'ordine desiderato.

Nella mia esperienza, non funziona! Nella mia esperienza, l'aggiunta di annotazioni usando addAnnotations: o aggiungendole una ad una genera lo stesso risultato. L'ordine delle viste di annotazione è ancora casuale.

[self.mapView addAnnotations:allAnnotations]; 

genera lo stesso risultato:

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

2). Usa bringSubviewToFront o sendSubviewToBack per specificare l'ordine di tutte le annotazioni.

Nella mia esperienza non funziona! Ad esempio, il seguente codice non genera i risultati richiesti:

- (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). Utilizzare annotationView.layer.zPosition per specificare l'ordine esatto di tutte le annotazioni.

Considerare uno scenario in cui 4 piedini si sovrappongono, ad es. Pin 1, 2, 3 e 4. Il problema con questo approccio è che toccare un pin di annotazione specifico o selezionarlo programmaticamente non lo porta in primo piano. Il zPosition è assoluto. Puoi cambiarlo ogni volta che viene selezionato un pin, ma non è l'ideale.

La proprietà zPosition specifica il componente asse z della posizione del livello. Lo zPosition è destinato a essere utilizzato per impostare la posizione visiva del layer relativa ai livelli fratelli. Non deve essere utilizzato per specificare l'ordine dei fratelli di livello, ma riordinare il livello nella matrice di sottolivelli.

Pensieri?

+0

L'ordine di annotazione cambia quando si toccano. Intendo per ogni tocco sul gruppo di annotazioni, la mappa mostrerà l'annotazione che non è in alto. Sì, l'ordine di annotazione non è fisso. Buon punto per un esperimento qui. – Kampai

risposta

4

ho finito per lavorare con 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 
    // . . . 
} 

Dove _zPositionForAnnotationViews è una variabile di classe.

+0

Perché non impostare un numero elevato per annotationView.layer.zPosition in didAddAnnotationViews :? E non per iterare trow tutte le visualizzazioni? – daleijn