MKMapView中心不正确

Luc*_*tti 9 objective-c uikit mkmapview ios

我有一个应用程序,我正在创建一个视图层次结构,我有一个mapview和一个tableview.mapview位于tableview下,当表垂直偏移为负时,它在顶部可见.视图的结构是这样的:

屏幕样机

黄色是地图的地方,顶部的绿色是导航栏,底部的绿色是桌面视图.

滚动表格视图时,地图应显示地图可见部分中心的用户位置.

我遇到的问题是,当我应用视差时,地图中心不是我正在设置的位置.这是我用来隔离问题的示例项目的屏幕截图.中心坐标是白金汉宫.

示例项目截图

橙色方块是一个调试视图,位于mapView的中心(中心坐标应该是).我确信视差效果是正确的.

关于示例项目中mapView的视图层次结构如下图所示.视图的位置反映了上面的截图.

在此输入图像描述

以下代码用于设置mapContainerView的frame.origin.y值.我正在使用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));
Run Code Online (Sandbox Code Playgroud)

我的猜测是状态栏正在对mapView做些什么.如果您查看模拟器截图,您可以注意到中心坐标是如何精确定位在从状态栏到mapView底部的垂直空间的中心.

在此输入图像描述

如果我在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
}
Run Code Online (Sandbox Code Playgroud)