2015-11-05 12 views
7

Mam aplikację, w której tworzę hierarchię widoków, w której mam widok mapy i widok tabeli. Widok mapy jest pod widokiem tableview i jest widoczny na górze, gdy offset pionowy tabeli jest ujemny. Struktura zdania jest mniej więcej tak:Centrum MKMapView nie jest prawidłowe

screen mockup

Jeżeli żółty jest mapa, na wierzchu zielony jest zielony pasek nawigacyjny i na dole jest tableview.

Podczas przewijania widoku tabeli mapa powinna pokazywać lokalizację użytkownika w środku widocznej części mapy.

Problemem jest to, że po zastosowaniu paralaksy centrum mapy nie jest położeniem, które ustawiam. To jest zrzut ekranu z przykładowego projektu, który zrobiłem, aby wyizolować problem. Współrzędną centrum jest Pałac Buckingham.

sample project screenshot

pomarańczowy kwadrat jest widokiem debugowania, który jest w środku MapView (gdzie współrzędna środek powinien być). Jestem pewien, że efekt paralaksy jest poprawny.

Struktura mojej hierarchii widoków dotyczących mapy Wyświetl w przykładowym projekcie jest przedstawiona na poniższym rysunku. Pozycja widoków odzwierciedla powyższy zrzut ekranu.

enter image description here

Poniższy kod służy do ustawiania wartości frame.origin.y z mapContainerView. Używam mapContainerView, aby uniknąć dotykania ramki mapy, aby wykonać efekt paralaksy. MapView jest podrzędny w mapContainerView (na pocz używałem tłumaczenie na MapView ale zmienił kod, aby spróbować zidentyfikować przyczynę tego problemu)

self.mapViewContainer.frame = CGRectMake(0, self.currentY, CGRectGetWidth(self.view.frame), CGRectGetHeight(self.view.frame)); 

if (!CGRectEqualToRect(self.mapViewContainer.bounds, self.mapView.bounds)) { 
    self.mapView.bounds = CGRectMake(0, 
            0, 
            CGRectGetWidth(self.mapViewContainer.bounds), 
            CGRectGetHeight(self.mapViewContainer.bounds)); 

    self.mapView.center = CGPointMake(CGRectGetMidX(self.mapViewContainer.bounds), 
             CGRectGetMidY(self.mapViewContainer.bounds)); 
} 

self.squareView.bounds = CGRectMake(0, 0, 22.0f, 22.0f); 
self.squareView.center = CGPointMake(CGRectGetMidX(self.mapViewContainer.bounds), 
            CGRectGetMidY(self.mapViewContainer.bounds)); 

Domyślam się, że pasek stanu jest robić coś na mapView. Jeśli spojrzysz na zrzut ekranu symulatora, zauważysz, że współrzędne środkowe są dokładnie zlokalizowane w środku pionowej przestrzeni, która przechodzi od paska stanu do dolnej części mapy.

enter image description here

Jeżeli ustawić centrum koordynowania w viewDidLoad po stworzeniu mapy (gdy jest to rama jest CGRectZero) środek mapie jest prawidłowo umieszczony w środku mapy.

Jeśli zmienię to później (na przykład z zegarem, który symuluje aktualizację lokalizacji, ustawia ten sam obszar mapy, który jest ustawiony w viewDidLoad) widok mapy decyduje się na zmianę środka, jak pokazano powyżej.

Nie mogę znaleźć żadnej metody wyłączenia lub zmiany tego zachowania. Czy robię coś złego tutaj? Pracuję nad obejściem, ale jestem ciekawy, czy ktoś wie, czego tu brakuje.

To jest kod przykładowego projektu utworzonego w celu odtworzenia problemu w scenariuszu izolowania. https://gist.github.com/lucabartoletti/a5f103cb74a3edb178d6

Mam pewne ograniczenie.

  • Mapa musi być na tyle duża, aby pokryć ramę okienną
  • Pasek stanu musi być widoczny

Odpowiedz

0

Spróbuj:

_mapView.delegate = self; 

func mapView(mapView: MKMapView!, didUpdateUserLocation 
     userLocation: MKUserLocation!) { 
    mapView.centerCoordinate = userLocation.location.coordinate 
}