2010-09-14 4 views
7

J'ai besoin de code qui peut être utilisé en dehors des fonctions mk *. J'ai besoin d'exécuter ma fonction personnalisée pour amener les marqueurs FIRST et LAST dans un tableau à l'avant. (donc au-dessus de tous les autres marqueurs sur mon écran). J'ai essayéiphone mapview apporte la première et dernière annotation à l'avant

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

Je l'ai utilisé [[mapView annotations]objectAtIndex: 0] dans mon code et qui fonctionne, mais il se bloque lorsque je tente de porter cette question à l'avant. Est-ce que j'accède à la mauvaise couche ou quelque chose?

merci pour toute aide.

Répondre

10

Vous apportez les mauvaises choses à l'avant. A savoir, le tableau annotations est un tableau d'objets qui se conforment au protocole MKAnnotation (donc du type id<MKAnnotation>), et ce ne sont pas des vues.

Au lieu de cela, vous devriez obtenir la vue pour les annotations que vous voulez, et apporter ceux à l'avant:

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

Cependant, il faut noter deux choses:

  1. annotationView peut nil si l'annotation est sur un point hors écran ou si les annotations n'ont pas encore été ajoutées à la carte. Cependant, si c'est nil, vous ne vous souciez probablement pas si une annotation qui n'est pas à l'écran est devant ou pas.
  2. Vous devez appeler bringSubviewToFront sur superview du annotationView, et non sur self.view ou même mapView, comme aucun des deux sont les superview du annotationView.
+0

cela a du sens - merci! Je n'ai pas besoin de m'inquiéter du fait que l'annotation soit nulle car le zoom précédent sur le code de la région m'assure que quand j'appellerai ce code ils seront à l'écran (au moins pour une fraction - comme ils sont dessinés). Je vais donner un coup de fouet au code demain. Merci beaucoup pour la réponse. –

+0

Appel important bringSubviewToFront sur annotationView.superview au lieu d'annotationView – Zee

+0

Vous pouvez également ajouter ceci if (! [L isKindOfClass: [classe MKUserLocation]]) { –

1

Cela a fonctionné beaucoup mieux pour moi:

dans

annotation configuration vue zPosition de couche (la annotationView.layer.zPosition):

- (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; 
} 

Notez que je suppose que le zPosition par défaut est 0. Réglage de 3 fait que tous les 3 marqueurs apparaissent au-dessus pour moi.

Questions connexes