我有一个应用程序,我正在创建一个视图层次结构,我有一个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,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,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
我有一些限制.
>地图必须足够大才能覆盖窗框
>状态栏必须可见
解决方法
试试这个:
_mapView.delegate = self; func mapView(mapView: MKMapView!,didUpdateUserLocation userLocation: MKUserLocation!) { mapView.centerCoordinate = userLocation.location.coordinate }