2010-09-14 22 views
7

Ho bisogno di un codice che possa essere usato al di fuori delle funzioni mk *. Devo eseguire la mia funzione personalizzata per portare in primo piano i marcatori FIRST e LAST in una matrice. (così sopra tutti gli altri marker sul mio schermo). Ho provatoiphone mapview porta in primo piano la prima e l'ultima annotazione

[self.view bringSubviewToFront:[[mapView annotations]objectAtIndex: 0]]; 

ho usato [[mapView annotations]objectAtIndex: 0] nel mio codice e che funziona, ma si blocca quando provo a portare questo al fronte. Sto accedendo al livello sbagliato o qualcosa del genere?

grazie per qualsiasi aiuto.

risposta

10

Stai portando le cose sbagliate in primo piano. Vale a dire, l'array annotations è una matrice di oggetti conformi al protocollo MKAnnotation (quindi di tipo id<MKAnnotation>) e non sono viste.

Invece, si dovrebbe essere sempre la vista per le annotazioni che si desidera, e portare quelli al fronte:

id<MKAnnotation> annotation = [[mapView annotations] objectAtIndex:0]; 
MKAnnotationView* annotationView = [mapView viewForAnnotation:annotation]; 
if (annotationView != nil) { 
    [annotationView.superview bringSubviewToFront:annotationView]; 
} 

Tuttavia, si dovrebbe notare un paio di cose:

  1. annotationView può essere nil se l'annotazione si trova su un punto fuori schermo o se le annotazioni non sono state aggiunte alla mappa. Tuttavia, se è nil, probabilmente non ti interessa se un'annotazione che non è nemmeno sullo schermo è davanti o no.
  2. È necessario chiamare il numero bringSubviewToFront sul superview del annotationView e non su self.view o anche su mapView, poiché nessuno di questi è il superview dello annotationView.
+0

che ha senso - grazie! Non ho bisogno di preoccuparmi che l'annotazione sia nulla, poiché il precedente zoom sul codice regionale assicura che quando chiamo questo codice saranno sullo schermo (almeno per una frazione - come vengono disegnati). Domani darò al codice un vortice. Molte grazie per la risposta. –

+0

Chiamata importante bringSubviewToFront su annotationView.superview invece di annotationView – Zee

+0

Si potrebbe anche voler aggiungere questo se (! [L isKindOfClass: [classe MKUserLocation]]) { –

1

Questo ha funzionato molto meglio per me:

configurazione vista annotazione del livello zPosition (annotationView.layer.zPosition) in:

- (MKAnnotationView *)mapView:(MKMapView *)theMapView viewForAnnotation:(id <MKAnnotation>)annotation 
{ 
    // if it's the user location, just return nil. 
    if ([annotation isKindOfClass:[MKUserLocation class]]) 
     return nil; 

    MKAnnotationView *returnedAnnotationView = nil; 
    returnedAnnotationView = [CUSTOMVIEW createViewAnnotationForMapView:self.mapView annotation:annotation]; 
    // SOME CUSTOM PROCESSING... 
    returnedAnnotationView.layer.zPosition = 3; 
    return returnedAnnotationView; 
} 

Nota che presumo lo zPosition predefinito è 0. Impostazione di 3 ha fatto apparire tutti i 3 marcatori per me.