如何正确抵消MKMapRect

时间:2014-04-17 08:05:22

标签: ios objective-c mkmapview mapkit mkmaprect

我必须在 MKMapView 上显示 MKMapRoute ,并且必须在我的地图上的特定区域中显示,而不是在中心,而是在顶部区域。 它必须放在约80个高度的“框架”中。

我以为我可以通过 MKMapView 的方法来实现这个目标

- (MKMapRect)mapRectThatFits:(MKMapRect)mapRect edgePadding:(UIEdgeInsets)insets

但是我面临着一些奇怪的现象。 确切地说,如果我使用这段代码:

//obj is the returned mkroute object.
MKRoute *rout = obj;        
MKPolyline *line = [rout polyline];
MKMapRect boundingMapRect = [line boundingMapRect];
MKMapRect fittedRect = [self.mapView mapRectThatFits:[line boundingMapRect] 
                               edgePadding:UIEdgeInsetsMake( 100, 0, 0, 0)];
MKCoordinateRegion r = MKCoordinateRegionForMapRect(fittedRect);
[self.mapView setRegion: r animated:YES];

结果在以下屏幕截图中可见:

MKMapRect with 100 points top inset

但是,如果我通过更改上一个代码段的第四行,将边缘插入设置为(0,0,0,0)

MKMapRect fittedRect = [self.mapView mapRectThatFits:[line boundingMapRect]  
                               edgePadding:UIEdgeInsetsMake( 100, 0, 0, 0)];

结果就是这个:

MKMapRect with 0 points top inset

正如您可以清楚地看到的,偏移量已经从顶部改变了50(而不是100)点。 当我使用 MKMapRegion 的跨度纬度和经度增量时,或者更改设备屏幕时,事情似乎变得更加奇怪。

现在,我的目的只是告诉 mapView 在一个框架中绘制该路线,说“从顶部64点,高度为80点,宽度为320点”,I我没有找到一个简单的方法来做这件事,我担心我错过了什么。我不想通过改变区域的纬度进行游戏,因为内容大小可能会有所不同(可能会有更小或更大的路线显示)。我错过了什么,这可能是一个简单的方法吗?为什么没有正确计算插图?

1 个答案:

答案 0 :(得分:6)

通过仅指定 顶部填充,地图视图会尝试最大化剩余空间中叠加层的显示大小,而不会扭曲地图并基于它可以呈现的缩放级别。所以你没有达到你想要的所需宽度和高度。

如果您计算并指定所有侧面的填充而不仅仅是顶部,则可以更好地控制叠加层的显示位置。

然而,地图视图仍然根据它可以呈现的内容调整实际显示的区域而不会扭曲地图等,但结果应该更接近你想要的。

根据你上一段中的这句话:

  

我的目的只是告诉mapView在“从顶部64点,高度为80点,宽度为320点”的框架中绘制该路线

这是一个如何接近该结果的示例:

MKRoute *rout = obj;        
MKPolyline *line = [rout polyline];

CGFloat desiredDistanceFromTop = 64.0;
CGFloat desiredWidth = 320.0;
CGFloat desiredHeight = 80.0;

CGFloat topPadding = desiredDistanceFromTop;
CGFloat leftPadding = (self.mapView.frame.size.width - desiredWidth) / 2.0;
CGFloat rightPadding = leftPadding;
CGFloat bottomPadding = self.mapView.frame.size.height 
                            - topPadding 
                            - desiredHeight;

UIEdgeInsets edgeInsets = 
    UIEdgeInsetsMake(topPadding, leftPadding, bottomPadding, rightPadding);

[self.mapView setVisibleMapRect:line.boundingMapRect 
                    edgePadding:edgeInsets 
                       animated:YES];

另外,请注意,没有必要将map rect转换为某个区域或自己计算“拟合”的rect / region:

  • 您可以使用setVisibleMapRect代替setRegion
  • setVisibleMapRectsetRegion 自己会根据请求的rect / region计算“拟合”的rect / region。