我必须在 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];

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

但是,如果通过以下方式将上一个片段的第四行更改为,将边缘插图设置为(0,0,0,0):
MKMapRect fittedRect = [self.mapView mapRectThatFits:[line boundingMapRect]
                               edgePadding:UIEdgeInsetsMake( 100, 0, 0, 0)];

结果是这样的:

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

现在,我的目的只是告诉 mapView 在“距顶部64点,高度80点,宽度320点”的框架中绘制该路线,我没有找到一种简单的方法这样做,恐怕会丢失一些东西。我不想改变区域的纬度,因为内容大小可能会有所不同(可能会显示更大或更小的路线)。我想念什么,做这件事的简单方法是什么?为什么插图没有正确计算?

最佳答案

通过仅指定顶部填充,地图视图将尝试在不影响地图变形的情况下并根据其可以显示的缩放级别最大化剩余空间中叠加层的显示大小。因此,您无法获得所需的宽度和高度。

如果您计算并指定所有边(而不是顶部)的填充,则可以更好地控制覆盖的显示位置。

但是,地图视图仍会根据实际显示的区域来调整实际显示的区域,而不会扭曲地图等,但是结果应该更接近您想要的区域。

根据您上一段的句子:

我的目的仅仅是告诉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];

另外,请注意,由于以下原因,不必自己将地图矩形转换为区域或计算“适合的”矩形/区域:
  • 您可以使用setVisibleMapRect代替setRegion
  • 给定所请求的rect / region,setVisibleMapRectsetRegion本身都会计算出“适合的” rect / region。
  • 08-16 19:15