Problem mit überlappenden Anmerkungen (MKAnnotationView) auf der Karte

stimmen
9

In meiner iPhone-Anwendung verwende ich MapKit mit MKMapView und benutzerdefinierter MKAnnotationView.

Das Problem ist, wenn Anmerkungen auf der Karte überlappen (in meiner app, Anmerkungen sind Fotos und diese Fotos überlappen können), und wenn Sie auf die Anmerkung tippen, die auf der Vorderseite erscheint, es ist eine andere Anmerkung (auf der Rückseite), die das Ereignis empfängt (scheint zufällig zu sein ).

Ich fand keine Möglichkeit, das Ereignis an die Front Anmerkung zu senden. Ich kann nicht glauben, dass dieser Fehler / Problem keine Lösung hat!

Z Ordnung und Reihenfolge der Anmerkungen überlappende Fragen auf Stackoverflow hat mir nicht so viel helfen.

Bitte jede Idee ist willkommen (auch schmutzige Lösungen)!

Hier einige meiner Code (nichts Besonderes, sehr häufig):

CustomAnnotation.h

@interface CustomAnnotation : NSObject <MKAnnotation> {
   @private
   CustomAnnotationView* view;
}

    @property (nonatomic, retain) CustomAnnotationView* view;

@end

CustomAnnotation.m

@implementation CustomAnnotation

@synthetize view;

CustomAnnotationView.h

@interface CustomAnnotationView : MKAnnotationView {
}

@end

CustomAnnotationView.m

@implementation CustomAnnotationView

- (void)touchesEnded:(NSSet *)touches withEvent:(UIEvent *)event{
// Do something related to the annotation tapped
}

@end

Hauptklasse ... // Anmerkungen hinzugefügt und einige von ihnen überlappt mit anderen.

- (void)addAnnotation:(CustomAnnotation*)annotation {
    [map addAnnotation:annotation];
}

...

- (MKAnnotationView *)mapView:(MKMapView *)mapView viewForAnnotation:(id <MKAnnotation>)annotation {

    NSString* identifier = getIdentifierFromAnnotation(annotation);
    CustomAnnotationView* view;
    if(!(view = (CustomAnnotationView*)[map dequeueReusableAnnotationViewWithIdentifier:identifier])) {
        view = [[CustomAnnotationView alloc] initWithAnnotation:annotation reuseIdentifier: identifier];
        [(CustomAnnotation*)annotation setView:view];
        [view release];
    }
    return view;
}
Veröffentlicht am 18/03/2010 um 16:07
quelle vom benutzer
In anderen Sprachen...                            


4 antworten

stimmen
2

Schließlich fand der beste Weg, ich und vermeidet Karte funcionalities zu verlieren ist:

  • lassen Sie den Touch-Hörer auf CustomAnnotationView (touchesEnded) (auf jeder Anmerkung)

  • wenn Berührungsereignis empfangen, übertragen das Ereignis Hauptklasse

  • Hauptklasse Schlaufen auf Annotationen und hält die Anmerkung, die eine gute Lage (Berührungsereignis in Annotation-Frame) hat, und das ist vor

Es funktioniert ziemlich gut.

Beantwortet am 22/04/2010 um 12:04
quelle vom benutzer

stimmen
0

Ich habe die UITapGestureRecognizer zur Ansicht auf der Vorderseite hinzugefügt und das löste das Problem für mich.

In Ihrem Fall sollte eine Gestenerkenner zu CustomAnnotationView Zugabe das Problem lösen.

Beantwortet am 15/12/2011 um 15:04
quelle vom benutzer

stimmen
0

Im Anschluss an Alexandre Antwort, deaktiviert ich alle meine benutzerdefinierten MKAnnotationViews Objekte mit

annView.enabled = NO

so dass sie reagieren nicht auf das MKMapView Standardauswahlverhalten, und in meinem benutzerdefinierten implementiert MKAnnotationView folgenden:

- (void)touchesEnded:(NSSet *)touches withEvent:(UIEvent *)event {
 self.enabled = YES;
 [(MKMapView*)self.superview selectAnnotation:self.annotation animated:NO];
}

Diese Lösung funktioniert auf iOS 4. Es scheint, wie das Deaktivieren ein MKAnnotationView nicht seine userInteractionEnabled deaktivieren, während auf iOS 3 es tut. Noch auf der Suche nach einer Lösung für iOS 3 ...

EDIT : eigentlich, dies scheint ein Bug in iOS 4.1 zu sein. In iOS 4.2, deaktiviert einen Stift auch das Deaktivieren der Touch - Ereignisse. Deshalb ist diese Methode funktioniert nur für 4.1 und möglicherweise 4.0.

Beantwortet am 21/10/2010 um 06:47
quelle vom benutzer

stimmen
0

Sehen Sie sich die Lösung dieser Frage . Grundsätzlich finden Sie eine transparente UIView erstellen , die alle von den Berührungen abfängt. Ich habe nicht versucht, aber das kann mehr Ärger als es wert ist , wenn Sie alle der Pinch-to-Zoom - Funktionalität in MKMapView reimplementieren müssen.

Wenn Sie zwei (oder mehr) MKAnnotations co-located können Sie immer wieder zwischen den beiden wechseln tippen. Das sollte ohne Änderungen an Ihrer Anwendung arbeiten.

Beantwortet am 21/04/2010 um 15:04
quelle vom benutzer

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