2010-09-14 6 views
7

Ich brauche etwas Code, der außerhalb der mk * Funktionen verwendet werden kann. Ich muss meine benutzerdefinierte Funktion ausführen, um die ersten und letzten Markierungen in einem Array nach vorne zu bringen. (also über allen anderen Markierungen auf meinem Bildschirm). Ich habe versucht,iphone mapview bringen erste und letzte Annotation an die Front

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

ich [[mapView annotations]objectAtIndex: 0] in meinem Code verwendet haben, und das funktioniert, aber es stürzt ab, wenn ich versuche, diese nach vorne zu bringen. Gehe ich auf die falsche Ebene oder etwas?

danke für jede Hilfe.

Antwort

10

Sie bringen die falschen Dinge an die Front. Das Array annotations ist nämlich ein Array von Objekten, die dem Protokoll MKAnnotation entsprechen (also vom Typ id<MKAnnotation>), und sie sind keine Ansichten.

Stattdessen sollten Sie den Blick für die Anmerkungen bekommen Sie wollen, und diejenigen nach vorne bringen:

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

Allerdings sollten Sie ein paar Dinge beachten:

  1. annotationView kann Geben Sie nil ein, wenn sich die Annotation an einem Punkt befindet, der nicht auf dem Bildschirm angezeigt wird, oder wenn die Annotationen nicht der Map hinzugefügt wurden. Wenn es jedoch nil ist, ist es Ihnen wahrscheinlich egal, ob eine Anmerkung, die nicht einmal auf dem Bildschirm ist, vor oder nicht ist.
  2. Sie müssen bringSubviewToFront auf den annotationView ‚s Super nennen, und nicht auf self.view oder sogar mapView, da keiner von denen die Super der annotationView ist.
+0

das macht Sinn - danke! Ich brauche mir keine Sorgen darüber zu machen, dass die Annotation null ist, da vorheriger Zoom auf Regionscode sicherstellt, dass sie, wenn ich diesen Code aufruft, auf dem Bildschirm erscheinen (zumindest für einen Bruchteil - wie sie gezeichnet werden). Ich werde morgen den Code ausprobieren. Vielen Dank für die Antwort. –

+0

Wichtiger Aufruf von bringSubviewToFront on annotationView.superview anstelle von annotationView – Zee

+0

Sie können dies auch hinzufügen, wenn (! [L isKindOfClass: [MKUserLocation class]]) { –

1

Das funktionierte viel besser für mich:

Setup Anmerkung zPosition (annotationView.layer.zPosition) Ansicht Schicht 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; 
} 

Bitte beachte, dass ich die Standard-zPosition nehmen ist 0. Einstellung zu 3 gemacht alle 3 Marker zeigen sich für mich an der Spitze.