首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何正确地抵消MKMapRect

如何正确地抵消MKMapRect
EN

Stack Overflow用户
提问于 2014-04-17 08:05:22
回答 1查看 2.9K关注 0票数 3

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

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

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

但我正面临着一些奇怪的事情。准确地说,如果我使用这段代码片段:

代码语言:javascript
复制
//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),将边缘嵌入设置为:

代码语言:javascript
复制
MKMapRect fittedRect = [self.mapView mapRectThatFits:[line boundingMapRect]  
                               edgePadding:UIEdgeInsetsMake( 100, 0, 0, 0)];

其结果是:

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

现在,我的目标只是告诉mapView在一个框架内画出这条路线,上面写着"64点,高度80分,宽320点“,我找不到一个简单的方法,恐怕我遗漏了一些东西。我不想通过改变区域的纬度来玩游戏,因为内容大小可能不同(可能有一个更小或更大的显示路线)。我错过了什么,有什么简单的方法可以做到这一点?为什么没有正确地计算这些插孔?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2014-04-17 13:18:00

通过只指定顶部填充,地图视图试图最大化显示的覆盖空间中的空间,而不扭曲地图,并根据它可以显示的缩放级别。所以你不能接近你想要的宽度和高度。

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

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

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

我的目标只是告诉mapView在一个框架内画出这条路线,上面有64点,高度80点,宽320点。

下面是一个如何接近这个结果的例子:

代码语言:javascript
复制
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];

另外,请注意,没有必要将地图rect转换为区域,也不必自己计算“合适的”rect/region,因为:

  • 您可以使用setVisibleMapRect而不是setRegion
  • setVisibleMapRectsetRegion本身都将计算一个“合适的”rect/区域,给出所请求的rect/区域。
票数 7
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/23127795

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档