2012-11-23 12 views
7

Zajmuję się tworzeniem aplikacji, w której chcę pokazywać fikcyjne samoloty latające zi na lotniska. To nie może być jedyne rzeczy, które chcę reprezentować, podróżując po mapie.Przenoszenie MKOverlayPathView znika za płytkami

Do tego użyłem przykładowego kodu z LocationReminders (posiadanej podklasy MKOverlayPathView, ReminderCircleView) i połączono go z MKOverlayem mojego własnego reprezentującego samolot. Ta klasa subskrybuje powiadomienia KVO o współrzędnych i właściwościach promienia klasy nakładki i unieważnia ścieżkę za każdym razem, gdy jest aktualizacja.

Nakładka aktualizuje swoją pozycję z częstotliwością kilku klatek na sekundę, a także aktualizuję jej promień, dzięki czemu mogę symulować perspektywę (niezbyt inteligentną, biorąc pod uwagę, że jest to obiekt modelu, ale nadal jest najlepszym rozwiązaniem, jakie znalazłem).

Używam prostej ścieżki do testowania.

Ta konfiguracja działa dobrze. Widok nakładki zostaje zaktualizowany i zachowuje się poprawnie, skalując wraz z mapą i wszystkimi.

Problem polega na tym, że w symulowanym locie nakładka nie zostanie narysowana na niektórych płytkach, zwykle w pobliżu miejsca docelowego. Koło wygląda tak, jakby było za tymi kaflami.

Byłem w stanie zrozumieć jedną rzecz w tym problemie: za każdym razem, gdy obserwuję, że koło nie jest rysowane przez jakiś kafelek, jeśli pomniejszysz, koło zostanie narysowane poprawnie. Powiększanie lub przesuwanie nie rozwiązuje jednak niczego.

Moja teoria mówi, że niektóre kafelki (lub ich odwzorowania map) nie są oznaczane do przerysowywania, a więc tylko przez oddalenie mogę je wymusić. Ale nadal uważam, że nie jest to zgodne z tym, że powiększanie nie wydaje się pomagać.

Nie wiem, czy robię coś złego, czy też wpadam na jakiś błąd. Używałem adnotacji i działało, ale tracę zdolność do reprezentowania płaszczyzny, która zmniejsza się, jeśli pomniejszysz bez obserwowania skali powiększenia.

Testowałem w wersjach 5.1, 6.0 i 6.1 i zachowanie jest takie samo.

Odpowiedz

2

Zrozumiałem, co było przyczyną tego zachowania.

Na mojej MKOverlay zmieniłem boundingMapRect, aby dopasować pozycję samolotu przy każdej aktualizacji pozycji. W rzeczywistości MKMapView prosi tylko o to MKOverlay (poznałem to, sprawdzając połączenia z -(BOOL)intersectsMapRect:(MKMapRect)mapRect).

Jako test zmieniłem boundingMapRect, aby dopasować do całego świata (boundingMapRect = MKMapRectWorld;) i zadziałało. Wtedy było tylko kwestią stworzenia MKMapRect wokół ścieżki mojego samolotu i to było to.

Cóż, Apple stwierdza co następuje odnośnie boundingMapRect:

prognozowanego prostokąt, który obejmuje nakładkę. (wymagane) (tylko do odczytu) Ta właściwość zawiera najmniejszy prostokąt, który całkowicie obejmuje obszar nakładki. Implementatorzy tego protokołu muszą ustawić ten obszar podczas implementacji swojej klasy nakładki. Prostokąt powinien zostać określony przy użyciu współrzędnych rzutowanych - czyli współrzędnych uzyskanych przez rzutowanie globusa na dwuwymiarową powierzchnię.

I powiedziałbym coś takiego:

Prognozowany prostokąt, który obejmuje nakładkę. (wymagane) (tylko do odczytu) Ta właściwość zawiera najmniejszy prostokąt obejmujący obszar , w którym nakładka może być wyświetlana w postaci. Implementatorzy tego protokołu muszą ustawić ten obszar podczas implementacji swojej klasy nakładki. Prostokąt powinien zostać określony przy użyciu współrzędnych rzutowanych - czyli współrzędnych uzyskanych przez rzutowanie globusa na dwuwymiarową powierzchnię.

Powiązane problemy