设置MapView的中心坐标不考虑MapView的完整大小(屏幕外部分)

时间:2015-05-13 14:59:10

标签: ios objective-c ios8 mkmapview

问题

我有一个包含全屏MKMapView的视图。 MapView的下半部分覆盖了一个具有半透明单元格的TableView,以便地图显示出来。

User location annotation blocked by TableView

当我以注释坐标为中心时,例如当前位置,注释视图被TableView阻止。

- (void)centerOnCurrentLocation
{
    MKCoordinateRegion region = MKCoordinateRegionMakeWithDistance(self.locationManager.location.coordinate, 50000, 50000);
    [self.mapView setRegion:[self.mapView regionThatFits:region] animated:YES];
}

尝试解决方案

我首先尝试以编程方式移动地图以偏移中心,向上移动注释。如果我关闭动画,这种方法很有效,尽管这不是一个简单的解决方案。我也不想关闭动画。

相反,我认为如果我将MapView从屏幕顶部扩展到与TableView相同的高度,MapView的中心就会正好在我想要的位置。它不起作用!当我在较大的MapView上设置中心坐标时,注释仍然出现在屏幕的中心,而不是在较大的MapView的中心。看起来MKMapView在计算其中心时使用了视图的可见区域。

Enlarged MapView

当我使用放大的MapView以当前位置为中心时,我希望看到这一点。

This is what I want to see when I center on current location.

如果只有MKMapView有一个centerOffset属性,允许你将中心移动一些CGPoint。

是否有人有一个简单,优雅的解决方案来抵消MapView的中心?

1 个答案:

答案 0 :(得分:1)

为了澄清我的评论,您可以使用setVisibleMapRect: edgePadding:创建所需的偏移量。您需要将它放在mapView委托方法regionDidChangeAnimated:中,这将在地图更改地图时随时触发,因此您需要使用标志包装代码以了解何时应用偏移量或者可以多次应用。以下是您需要做的事情:

- (void)mapView:(MKMapView *)mapView regionDidChangeAnimated:(BOOL)animated{

    if (!self.mapInsetsSet) {
        self.mapInsetsSet=TRUE;
        [self.myMapView setVisibleMapRect:self.myMapView.visibleMapRect edgePadding:UIEdgeInsetsMake(10, 0, 0, 0) animated:YES];
    }

}

在上面的代码中,mapInsetsSet只是一个bool,您可以在其他位置设置以控制何时应用偏移量。此外,您需要将UIEdgeInsetsMake调整为所需的偏移量。