Z-Bestellung von MKAnnotationViews

stimmen
13

Ich bin immer ziemlich frustriert mit den Einschränkungen von MKMapKit. Mein aktuelles Problem hat mit der z-Ordnung der Beschriftungsansichten zu tun, vor allem, da es auf Berührungen bezieht. Wenn Sie den Standard-Z-Auftrag an der MapKit gibt Ihnen:

  1. Die Reihenfolge erscheint zufällig. Die z-Reihenfolge ist unabhängig von der Reihenfolge, die Anmerkungen hinzugefügt wurden.
  2. Wenn eine Anmerkung oben auf einen Treffer endet, die obere Anmerkung zu berühren bringt im Allgemeinen die Legende für die untere Anmerkung oben. Es scheint, wie der Treffererfassungs nicht einmal die Zeichnungsreihenfolge einhalten. Was ist damit?

Ich habe versucht, # Lösung 1 im Web gefunden, etwas ähnlich dem folgenden Code (das entworfen wurde, eine gewisse Kontrolle über Z-Reihenfolge zu geben)

- (void) mapView: (MKMapView *) mapView didAddAnnotationViews: (NSArray *) Ansichten {
   für (MKAnnotationView * annView in Aussicht) {
      TopBottomAnnotation ann * = (TopBottomAnnotation *) [annView Annotation];
      if ([ann top]) {
         [[AnnView Super] bringSubviewToFront: annView];
      } Else {
         [[AnnView Super] sendSubviewToBack: annView];
      }
   }

}

Laufen durch die Beschriftungsansichten weitergegeben mapView: didAddAnnotationViews: und ihre Z-Reihenfolge Einstellung scheint # 1 zu beheben. Das Problem ist, dass jetzt die callout Ansichten sind nicht mehr immer oben auf die Beschriftungsansichten. Die MapKit scheint über die Schichten sehr verwirrt zu bekommen (Callouts in einer Ebene über alle Beschriftungsansichten gezeichnet werden soll). Ich kann sogar herausfinden, wie es ist verwirrt, da alle MKAnnotationViews Sie haben die gleiche Superview erhalten (eine private Klasse MKOverlayView). Sie würden denken, jedes vernünftiges Design die Legenden über diese Überlagerungsansicht ziehen würde.

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

Veröffentlicht am 05/11/2009 um 17:04
quelle vom benutzer
In anderen Sprachen...                            


3 antworten

stimmen
8

Wenn Sie eine benutzerdefinierte AnnotationView haben (was klingt wie Sie bereits haben) können Sie versuchen, diese und fügte hinzu:

- (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 auf die Vorderseite der z-Ordnung erscheint berührt wird, die tatsächlich sinnvoll ist, denn das ist, was der Benutzer auf konzentriert.

Beantwortet am 05/11/2009 um 17:54
quelle vom benutzer

stimmen
7

Ramin, die für vollkommen ist, was ich versuche zu tun. Ich habe nicht eine benutzerdefinierte Anmerkungsansicht obwohl definiert. Ich löste dies durch eine Kategorie mit und es funktionierte perfekt!

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
Beantwortet am 04/12/2009 um 19:40
quelle vom benutzer

stimmen
6

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

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

Beantwortet am 03/05/2013 um 12:12
quelle vom benutzer

Cookies help us deliver our services. By using our services, you agree to our use of cookies. Learn more