У меня есть приложение, где я создаю иерархию представлений, где у меня есть mapview и tableview. Mapview находится под табличным представлением и отображается сверху, когда вертикальное смещение таблицы отрицательное. Строение зрения что-то вроде этого:Центр MKMapView не корректен
Если желтый карта, зеленый на вершине навигационная панель и зеленый в нижней части находится TableView.
Когда вы просматриваете представление таблицы, на карте должно отображаться местоположение пользователя в центре видимой части карты.
Проблема, с которой я столкнулся, заключается в том, что когда я применяю параллакс, центр карты не является местоположением, которое я устанавливаю. Это скриншот из примера проекта, который я сделал, чтобы изолировать проблему. Координата центра - Букингемский дворец.
Оранжевый квадрат представляет собой вид отладки, который находится в центре MAPview (где центр координат должно быть). Я уверен, что эффект параллакса правильный.
Структура моей иерархии представлений относительно mapView в примере проекта представлена на следующем изображении. Позиция просмотров отражает скриншот выше.
Следующий код используется для установки значения frame.origin.y в mapContainerView. Я использую mapContainerView, чтобы не касаться рамки mapView для выполнения эффекта параллакса. MAPview является подвид в mapContainerView (в Бегин я использовал перевод на MAPview, но я изменил код, чтобы попытаться изолировать причину этой проблемы)
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));
Моя догадка, что строка состояния что-то делать с mapView. Если вы посмотрите на скриншот симулятора, вы можете заметить, как координаты центра точно расположены в центре вертикального пространства, идущего от строки состояния до нижней части mapView.
Если я установить центр координаты в viewDidLoad, после создания карты (если это кадр CGRectZero) центр карты правильно в центре карты.
Если я изменил его позже (например, с помощью таймера, который, чтобы имитировать обновление местоположения, устанавливает ту же область карты, что и она, в viewDidLoad), на экране карты решено изменить центр, как показано выше.
Я не могу найти способ отключить или изменить это поведение. Я здесь что-то не так? Я работаю над обходным решением, но мне любопытно узнать, знает ли кто-нибудь, чего я здесь не вижу.
Это код примера проекта, который я создал для воспроизведения проблемы в сценарии изоляции. https://gist.github.com/lucabartoletti/a5f103cb74a3edb178d6
Некоторые ограничения у меня есть.
- карта должна быть достаточно большой, чтобы покрыть оконную раму
- Строка состояния должна быть видна