gpt4 book ai didi

ios - 如何正确偏移 MKMapRect

转载 作者:塔克拉玛干 更新时间:2023-11-01 19:08:18 26 4
gpt4 key购买 nike

我必须在 MKMapView 上显示一个 MKMapRoute,它必须显示在我 map 上的特定区域,而不是在中心,而是在顶部区域。它必须放在一个大约 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 的跨度纬度和经度增量或更改设备屏幕时,事情似乎变得更加奇怪。

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

最佳答案

通过指定顶部填充, map View 会尝试在不扭曲 map 的情况下并根据它可以呈现的缩放级别最大化剩余空间中叠加层的显示大小。所以你不会接近你想要的宽度和高度。

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

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

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

my aim is simply to tell mapView to draw that route in a frame of say "64 points from the top and with an height of 80 points and a width of 320 points"

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

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 矩形转换为区域或自己计算“拟合”矩形/区域,因为:

  • 您可以使用 setVisibleMapRect 代替 setRegion
  • setVisibleMapRectsetRegion 都将自己计算给定请求的矩形/区域的“拟合”矩形/区域。

关于ios - 如何正确偏移 MKMapRect,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23127795/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com