2015-11-05 15 views
7

Ho un'app in cui sto creando una gerarchia di viste in cui ho una mapview e una tableview. La mappa è sotto la vista tabella ed è visibile in alto quando l'offset verticale della tabella è negativo. La struttura della vista è qualcosa di simile:Centro MKMapView non corretto

screen mockup

dove il giallo è la mappa, il verde in alto è una barra di navigazione e verde in fondo è la Tableview.

Quando si scorre la vista tabella la mappa dovrebbe mostrare la posizione dell'utente al centro della porzione visibile della mappa.

Il problema che sto vivendo è che quando applico la parallasse il centro della mappa non è la posizione che sto impostando. Questa è una schermata di un progetto di esempio che ho fatto per isolare il problema. Il coordinato del centro è Buckingham Palace.

sample project screenshot

Il quadrato arancione è una vista di debug che è al centro della mapview (dove la coordinata centro dovrebbe essere). Sono sicuro che l'effetto di parallasse è corretto.

La struttura della gerarchia della mia vista relativa alla mapView nel progetto di esempio è rappresentata nell'immagine seguente. La posizione delle viste riflette lo screenshot qui sopra.

enter image description here

Il codice seguente viene utilizzato per impostare il valore frame.origin.y del mapContainerView. Sto usando mapContainerView per evitare di toccare la cornice di mapView per eseguire l'effetto di parallasse. Il MapView è una visualizzazione secondaria del mapContainerView (al comincio stavo usando traduzione sul MapView, ma ho cambiato il codice per tentare di isolare la causa di questo problema)

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)); 

La mia ipotesi è che la barra di stato è fare qualcosa per il mapView. Se si guarda lo screenshot del simulatore, è possibile notare come le coordinate del centro si trovino esattamente al centro dello spazio verticale che va dalla barra di stato alla parte inferiore di mapView.

enter image description here

Se i impostare il centro del punto nel viewDidLoad, dopo la creazione della mappa (quando è telaio è CGRectZero) il centro della mappa è esattamente al centro della mappa.

Se lo cambio in un secondo momento (ad esempio con un timer che, per simulare l'aggiornamento della posizione, imposta la stessa area della mappa che è impostata in viewDidLoad) la vista della mappa decide di cambiare il centro come mostrato sopra.

Non riesco a trovare alcun metodo per disabilitare o modificare questo comportamento. Sto facendo qualcosa di sbagliato qui? Sto lavorando a una soluzione alternativa ma sono curioso di sapere se qualcuno sa cosa mi manca qui.

Questo è il codice del progetto di esempio che ho creato per riprodurre il problema in uno scenario isolato. https://gist.github.com/lucabartoletti/a5f103cb74a3edb178d6

Alcune restrizioni che ho.

  • La mappa deve essere abbastanza grande da coprire il telaio della finestra
  • La barra di stato deve essere visibile

risposta

0

Prova questo:

_mapView.delegate = self; 

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