Ich habe eine App, wo ich eine Ansichten Hierarchie erstellen, wo ich eine Mapview und eine Tabellenansicht habe. Die Kartenansicht befindet sich unter der Tabellenansicht und ist oben sichtbar, wenn der vertikale Versatz der Tabelle negativ ist. Die Struktur der Ansicht ist so etwas wie diese:MKMapView Center nicht korrekt
Wo die gelbe ist die Karte, die grün auf der Oberseite ist eine Navigationsleiste und grün an der Unterseite ist der Tableview.
Wenn Sie in der Tabellenansicht blättern, sollte die Karte den Benutzerstandort in der Mitte des sichtbaren Teils der Karte anzeigen.
Das Problem, das ich erfahre ist, dass, wenn ich die Parallaxe anwende, das Kartenzentrum nicht der Ort ist, den ich einstelle. Dies ist ein Screenshot aus einem Beispielprojekt, das ich gemacht habe, um das Problem zu isolieren. Die zentrale Koordinate ist Buckingham Palace.
Das orange Quadrat ist eine Debug-Ansicht, die in der Mitte des mapView (wo das Zentrum sollte Koordinate) ist. Ich bin mir sicher, dass der Parallax-Effekt stimmt.
Die Struktur meiner Ansichtshierarchie bezüglich der mapView im Beispielprojekt ist in der folgenden Abbildung dargestellt. Die Position der Ansichten spiegelt den obigen Screenshot wider.
Der folgende Code wird verwendet, um den Wert des frame.origin.y mapContainerView einzustellen. Ich verwende die mapContainerView, um zu vermeiden, den Rahmen der MapView zu berühren, um den Parallaxeneffekt durchzuführen. Die mapView ist ein Subview der mapContainerView (zu Beginn war ich auf der mapView eine Übersetzung mit, aber ich änderte den Code zu versuchen, die Ursache dieses Problems zu isolieren)
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));
Meine Vermutung ist, dass die Statusleiste etwas zur mapView machen. Wenn Sie sich den Screenshot des Simulators ansehen, können Sie feststellen, wie genau die Mittelkoordinate in der Mitte des vertikalen Raums liegt, der von der Statusleiste bis zum Ende der mapView reicht.
Wenn ich die Mitte der Koordinate in der viewDidLoad, nach der Erstellung der Karte (wenn es Rahmen CGRectZero ist) die Mitte der Karte korrekt in der Mitte der Karte.
Wenn ich es später ändere (zum Beispiel mit einem Timer, der, um die Standortaktualisierung zu simulieren, dieselbe Kartenregion einstellt, die in der viewDidLoad festgelegt wurde), dann ändert die Kartenansicht das Zentrum, wie oben gezeigt.
Ich kann keine Methode zum Deaktivieren oder Ändern dieses Verhaltens finden. Mache ich hier etwas falsch? Ich arbeite an einem Workaround, aber ich bin neugierig zu wissen, ob jemand weiß, was ich hier vermisse.
Dies ist der Code des Beispielprojekts, das ich erstellt habe, um das Problem in einem Isolatszenario zu reproduzieren. https://gist.github.com/lucabartoletti/a5f103cb74a3edb178d6
Einige Einschränkungen, die ich habe.
- Die Karte muss groß genug sein, um die Fensterrahmen
- Die Statusleiste bedecken müssen diese