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?
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