2012-11-23 5 views
7

Ich entwickle eine App, in der ich fiktive Flugzeuge zeigen möchte, die von und zu Flughäfen fliegen. Das sind vielleicht nicht die einzigen Dinge, die ich durch die Karte fliegen möchte.Moving MKOverlayPathView verschwindet hinter Kacheln

Dazu habe ich den Beispielcode von LocationReminders (die MKOverlayPathView-Unterklasse, die sie haben, ReminderCircleView) und verband es mit einem MKOverlay meiner eigenen Darstellung des Flugzeugs. Diese Klasse abonniert KVO-Benachrichtigungen zu den Koordinaten- und Radiuseigenschaften der Überlagerungsklasse und macht ihren Pfad bei jeder Aktualisierung ungültig.

Das Overlay aktualisiert seine Position bei mehreren Frames pro Sekunde und ich aktualisiere auch seinen Radius, so dass ich Perspektive simulieren kann (nicht sehr schlau, da es ein Modellobjekt ist, aber immer noch die beste Lösung, die ich gefunden habe).

Ich verwende einen einfachen Kreis Pfad zum Testen.

Diese Einrichtung funktioniert einwandfrei. Die Überlagerungsansicht wird aktualisiert, und sie verhält sich korrekt und skaliert mit der Karte und allen.

Das Problem ist, dass in einem simulierten Flug die Überlagerung nicht über einige der Kacheln gezogen wird, normalerweise in der Nähe des Ziels. Der Kreis sieht aus wie hinter diesen Kacheln.

konnte ich eine Sache in diesem Problem verstehen: wenn ich der Kreis nicht über einige Ziegel beobachten gezogen zu werden, wenn ich der Kreis richtig gezeichnet verkleinern wird. Zoomen oder Panning löst jedoch nichts.

Meine Theorie ist, dass einige der Fliesen (oder ihre Karte Rects) nicht für die Wiederherstellung und so markiert wird, nur durch ich, dass zwingen Auszoomen kann. Aber ich denke, das stimmt nicht mit der Tatsache überein, dass das Zoomen nicht hilft.

Ich weiß nicht, ob ich etwas falsch mache oder ob ich auf einen Fehler oder etwas stoße. Ich habe stattdessen Annotationen verwendet und es funktionierte, aber damit verliere ich die Fähigkeit, ein Flugzeug darzustellen, das kleiner wird, wenn Sie auszoomen, ohne die Zoomskala selbst zu beobachten.

Ich habe in den Versionen 5.1, 6.0 und 6.1 getestet und das Verhalten ist das gleiche.

Antwort

2

Ich habe verstanden, was dieses Verhalten verursacht hat.

Auf meiner MKOverlay änderte ich die boundingMapRect, um die Position des Flugzeugs bei jeder Positionsaktualisierung zu entsprechen. Eigentlich fragt das MKMapView nur die MKOverlay dafür am Anfang (ich habe das durch Überprüfen der Anrufe zu -(BOOL)intersectsMapRect:(MKMapRect)mapRect kennen gelernt).

Als Test habe ich die boundingMapRect geändert, um die ganze Welt (boundingMapRect = MKMapRectWorld;) und es funktionierte. Dann war es nur eine Frage der Schaffung eines MKMapRect um den Weg meines Flugzeugs und das war es.

Nun, sagt Apple den folgenden in Bezug auf boundingMapRect:

Das projizierte Rechteck, das die Overlay umfasst. (erforderlich) (schreibgeschützt) Diese Eigenschaft enthält das kleinste Rechteck, das den Überlagerungsbereich vollständig umfasst. Implementierer dieses Protokolls müssen diesen Bereich bei der Implementierung ihrer Overlay-Klasse festlegen. Das Rechteck sollte mit projizierten Koordinaten-werden, die festgelegt ist, die Kugel erhaltenen Koordinaten auf einer zweidimensionalen Oberfläche durch Projizieren.

Und ich würde sagen, so etwas wie:

Das projizierte Rechteck, das die Overlay umfasst. (erforderlich) (schreibgeschützt) Diese Eigenschaft enthält das kleinste Rechteck, das den Bereich vollständig umfasst, in dem das Overlay in dargestellt werden kann. Implementierer dieses Protokolls müssen diesen Bereich bei der Implementierung ihrer Overlay-Klasse festlegen. Das Rechteck sollte mit projizierten Koordinaten-werden, die festgelegt ist, die Kugel erhaltenen Koordinaten auf einer zweidimensionalen Oberfläche durch Projizieren.