2009-11-05 8 views
13

Ich bin ziemlich frustriert mit den Einschränkungen von MKMapKit. Mein aktuelles Problem hat mit der z-Anordnung von Anmerkungsansichten zu tun, insbesondere in Bezug auf Berührungen. Wenn Sie die standardmäßige Z-Reihenfolge akzeptieren, gibt Ihnen das Mapkit Folgendes:Z-Bestellung von MKAnnotationViews

  1. Die Reihenfolge erscheint zufällig. Die Z-Reihenfolge hat keinen Bezug zur Reihenfolge, in der die Anmerkungen hinzugefügt wurden.
  2. Wenn eine Anmerkung über einer anderen endet, wird durch Tippen auf die obere Anmerkung im Allgemeinen die Legende für die untere Anmerkung angezeigt. Es scheint, als ob die Treffererkennung nicht einmal die Zeichenreihenfolge berücksichtigt. Was ist damit?

Ich habe die Lösung versucht, # 1 auf dem Internet gefunden, etwas ähnlich dem folgenden Code

 
- (void)mapView:(MKMapView *)mapView didAddAnnotationViews:(NSArray *)views { 
    for (MKAnnotationView * annView in views) { 
     TopBottomAnnotation * ann = (TopBottomAnnotation *) [annView annotation]; 
     if ([ann top]) { 
     [[annView superview] bringSubviewToFront:annView]; 
     } else { 
     [[annView superview] sendSubviewToBack:annView]; 
     } 
    } 

} 

Laufen durch die Beschriftungsansichten (die eine gewisse Kontrolle über z-Ordnung zu geben entworfen wurde) übergeben zu mapView: didAddAnnotationViews: und ihre Z-Reihenfolge zu justieren scheint # 1 zu beheben. Das Problem besteht nun darin, dass die Callout-Ansichten nicht mehr im Vordergrund der Anmerkungsansichten stehen. Das MapKit scheint sehr verwirrt über die Layer zu sein (Callouts sollten in einer Ebene über allen Anmerkungsansichten gezeichnet werden). Ich kann sogar herausfinden, wie es verwirrt wird, da alle MKAnnotationViews, die Sie erhalten, die gleiche Superview (eine private Klasse MKOverlayView) haben. Sie würden denken, dass jedes vernünftige Design die Callouts über diese Overlay-Ansicht zeichnen würde.

Hat jemand # 1 oder # 2 erfolgreich gelöst?

+0

Woher haben Sie die TopBottomAnnotation-Klasse? –

+0

Die TopBottomAnnotation ist der Name Ihrer AnnotationView-Klasse –

+1

... fast 6 Jahre später und ich habe das gleiche Problem. Wie ist das nicht behoben worden? – Tys

Antwort

8

Wenn Sie eine benutzerdefinierte AnnotationView (das klingt wie Sie bereits haben) können Sie versuchen, das Hinzufügen dieses:

- (void)touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event 
{ 
    [self.superview bringSubviewToFront:self]; 
    [super touchesBegan:touches withEvent:event]; 
} 

Ein Nebeneffekt ist, dass jedes Mal, wenn eine Markierung auch nach vorne knallt berührt wird von die Z-Reihenfolge, die eigentlich sinnvoll ist, da sich der Benutzer darauf konzentriert.

+0

Ramin, Danke für die Antwort. Ich glaube nicht, dass das mein Problem löst. Es sind die Callouts, die nicht über den Anmerkungsansichten angezeigt werden. Ich muss auch diese Z-Reihenfolge der Anmerkungsansichten steuern, ohne dass der Benutzer sie berühren muss. Einige der Ansichten haben eine höhere "Priorität" und sollten über anderen Ansichten mit niedrigerer Priorität angezeigt werden. – btschumy

+0

Ich weiß nicht, ob es das gleiche Problem ist, aber ich hatte eine Reihe von Marker Pins dicht beieinander.Wenn Sie auf jeden Pin tippen, werden die Callouts unter den anderen Pins angezeigt. Daher sieht es so aus, als ob jeder Annotation View eine eigene Callout-Ebene enthält. Aber Sie haben Recht, Callouts sollten auf ihrer eigenen obersten Ebene sein. Möchte einen Fehlerbericht erstellen. – Ramin

+0

Ramin, Ich habe gerade Ihre Lösung versucht, und es löst tatsächlich das Problem, dass Callouts nicht auf allen Annotationen angezeigt werden. Vielen Dank. Es scheint immer noch ein Problem zu geben, bei dem die Anmerkung die Berührung erhält, wenn sie sich überlappen. Aber das ist weniger wichtig als die andere Lösung. – btschumy

7

Ramin, das ist perfekt für das, was ich versuche zu tun. Ich hatte jedoch keine benutzerdefinierte Anmerkungsansicht definiert. Ich habe das mit einer Kategorie gelöst und es hat perfekt funktioniert! Hier

ist der Header:

#import <Foundation/Foundation.h> 
#import <MapKit/MapKit.h> 


@interface MKPinAnnotationView (ZIndexFix) 
- (void)touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event; 
@end 

Und die Umsetzung:

#import "AEBMapViewCategory.h" 
@implementation MKPinAnnotationView (ZIndexFix) 
- (void)touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event 
{ 
    [self.superview bringSubviewToFront:self]; 
    [super touchesBegan:touches withEvent:event]; 
} 
@end 
+0

Ausgezeichnet ... Das ist, was ich ein gutes Stück Code nennen. – Biranchi

+0

Wie sollte das zusammen mit der mapViewForAnnotations oder allgemeiner der Rest einer Mapview-Anwendung? Entschuldigung, es ist mir nicht klar. – si28719e

+0

wow. das scheint irgendwie zu funktionieren. Das ist ziemlich erstaunlich, aber ich würde immer noch gerne wissen, warum. und ich habe keine Ahnung. – si28719e

6

Versuchen Sie eine andere Lösung, Setup-Anmerkungsansicht Layers zPosition (annotationView.layer.zPosition) in:

(void) mapView: (MKMapView *) mapView didAddAnnotationViews: (NSArray *) Ansichten;

+0

Der richtige Weg, es zu tun – rmvz3