2015-11-05 3 views
7

У меня есть приложение, где я создаю иерархию представлений, где у меня есть mapview и tableview. Mapview находится под табличным представлением и отображается сверху, когда вертикальное смещение таблицы отрицательное. Строение зрения что-то вроде этого:Центр MKMapView не корректен

screen mockup

Если желтый карта, зеленый на вершине навигационная панель и зеленый в нижней части находится TableView.

Когда вы просматриваете представление таблицы, на карте должно отображаться местоположение пользователя в центре видимой части карты.

Проблема, с которой я столкнулся, заключается в том, что когда я применяю параллакс, центр карты не является местоположением, которое я устанавливаю. Это скриншот из примера проекта, который я сделал, чтобы изолировать проблему. Координата центра - Букингемский дворец.

sample project screenshot

Оранжевый квадрат представляет собой вид отладки, который находится в центре MAPview (где центр координат должно быть). Я уверен, что эффект параллакса правильный.

Структура моей иерархии представлений относительно mapView в примере проекта представлена ​​на следующем изображении. Позиция просмотров отражает скриншот выше.

enter image description here

Следующий код используется для установки значения 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.

enter image description here

Если я установить центр координаты в viewDidLoad, после создания карты (если это кадр CGRectZero) центр карты правильно в центре карты.

Если я изменил его позже (например, с помощью таймера, который, чтобы имитировать обновление местоположения, устанавливает ту же область карты, что и она, в viewDidLoad), на экране карты решено изменить центр, как показано выше.

Я не могу найти способ отключить или изменить это поведение. Я здесь что-то не так? Я работаю над обходным решением, но мне любопытно узнать, знает ли кто-нибудь, чего я здесь не вижу.

Это код примера проекта, который я создал для воспроизведения проблемы в сценарии изоляции. https://gist.github.com/lucabartoletti/a5f103cb74a3edb178d6

Некоторые ограничения у меня есть.

  • карта должна быть достаточно большой, чтобы покрыть оконную раму
  • Строка состояния должна быть видна

ответ

0

Попробуйте это:

_mapView.delegate = self; 

func mapView(mapView: MKMapView!, didUpdateUserLocation 
     userLocation: MKUserLocation!) { 
    mapView.centerCoordinate = userLocation.location.coordinate 
} 
Смежные вопросы