如何正确偏移 MKMapRect

Posted

技术标签:

【中文标题】如何正确偏移 MKMapRect【英文标题】:How to offset properly an MKMapRect 【发布时间】:2014-04-17 08:05:22 【问题描述】:

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

我以为我可以通过使用 MKMapView 的方法来实现这一点

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

但我遇到了一些奇怪的事情。 准确地说,如果我使用这段 sn-p 代码:

//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];

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

但是,如果我将之前的 sn-p 的第四行更改为:

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

结果是这个:

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

现在,我的目标只是告诉 ma​​pView 在“距顶部 64 点,高度为 80 点,宽度为 320 点”的框架中绘制该路线,我'没有找到一种简单的方法来做到这一点,我担心我错过了一些东西。我不想通过改变区域的纬度来玩,因为内容大小可能会有所不同(显示的路线可能更小或更大)。我错过了什么,有什么简单的方法可以做到这一点?为什么插图没有正确计算?

【问题讨论】:

【参考方案1】:

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

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

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

根据你最后一段中的这句话:

我的目的只是告诉 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 代替setRegionsetVisibleMapRectsetRegion 都将自己根据请求的矩形/区域计算“拟合”矩形/区域。

【讨论】:

我得到了一个完全不同的解决方案,但问题与您在此处描述的相同,我必须指定所有插图,现在一切正常! 谢谢!就我而言,我只需要从底部 200 像素偏移。但同样 - 地图定位正确,但缩小了结果。然后我只是尝试: mapView.setVisibleMapRect(mapRect, edgePadding: UIEdgeInsets(top: -100, left: 0, bottom: 100, right: 0), animated: false) 并且它正确定位,具有正确的缩放级别(好像没有使用edgePadding)

以上是关于如何正确偏移 MKMapRect的主要内容,如果未能解决你的问题,请参考以下文章

如何以正确的格式获取 UTC 偏移量(时区)?

C# - Stream.Read 偏移工作不正确

如何正确使用 Kafka 消费者“寻找”以返回所有分区的未提交偏移量?

通过阅读 .hex 和 .map,我如何确定 BL 链接到正确的函数偏移量?

Excel 中的偏移值 - 偏移公式似乎不是正确的用例

为啥这个 Joda 偏移不能正确实现夏令时