如何在上半部分 og mapview 上显示注释?

How to show annotations on the upper half og mapview?

我有一个特殊情况,我似乎无法理解。

我有一个全屏地图视图作为背景。在下半部分,我有一些其他元素,我需要为我的 mapview 设置 mapregion,以便所有注释都可见并位于视图的上半部分。

我可以找到所有注释的 maprect。 我还可以找到上半部分的矩形 - 甚至可以将其转换为 maprect。

但是我如何关联这两个 maprect 以便将适合注释的 maprect 移动(并挤压)到上半部分?

任何人都可以给我一些提示吗?

我曾经有过类似的设计,只是它是针对单个注释而不是多个,但原则上它是同一件事。

在 ViewDidLayoutSubviews 中:

  1. 制作一个包含您的注释的 MKRegion 创建一个 CGPoint 那是在未被覆盖的地图部分的中心。
  2. 改变 您所在区域的中心到未覆盖地图部分的中心 通过使用 MKMapView.convert(point: toCoordinateFrom:)
  3. 显示新的 通过调用 mapView.setRegion(region, animated: false)
  4. 居中

您需要弄清楚哪个区域包含您的注释(并不难,只需找到最大和最小纬度、经度并添加填充)。这是其余部分的示例代码:

        let point = CGPoint(x: mapView.bounds.size.width/2, y: -100)
        region.center = mapView.convert(point, toCoordinateFrom: mapView)
        mapView.setRegion(region, animated: false)

我找到了一个相当简单但有效的解决方案。

想法是使用地图矩形而不是区域。

MKMapRect totalMapRect = MKMapRectNull;
    for (id<MKAnnotation> annotation in self.mapView.annotations)
    {
        MKMapPoint annotationPoint = MKMapPointForCoordinate(annotation.coordinate);
        MKMapRect mapRect = MKMapRectMake(annotationPoint.x, annotationPoint.y, 0.1, 0.1);
        totalMapRect = MKMapRectUnion(totalMapRect, mapRect);
    }
    [self.mapView setVisibleMapRect:totalMapRect edgePadding:UIEdgeInsetsMake(30, 30, 30 + verticalOffset, 30) animated:YES];

我们的想法是遍历所有注释并为每个注释创建一个最小映射矩形并将它们联合在一起。这将为您提供所有注释的最小矩形。

然后你可以使用 [setVisibleMapRect: edgePadding:] 并添加任何边距,这样针脚就会出现在屏幕上,下边距应该只是边距 + 偏移量。

这适用于多个注释,但对于 1 个注释,矩形将非常狭窄,以至于地图将被放大太多以致于无法理解。 在这种情况下,您将不得不 fiddle 使用矩形大小。

替代方案(Swift 4.2)

Josh's 解决方案有效,但它需要您设置区域两次,这在您的应用程序中可能看起来像滞后,所以我建议不要这样做。相反,您可以使用一些简单的坐标知识提前移动适合您的注释的区域,然后您只需要设置一次地图区域。

MKCoordinateRegion 的跨度属性包含进行转换所需的所有信息。跨度表示可以在地图视图中移动的度数,即。 latitudeDelta 为 1 的跨度表示从地图顶部到底部的距离是一个纬度。因此,只需根据跨度将您所在区域的中心坐标向上移动即可:

var coordinate = regionThatFitsYourAnnotation.center
let span = regionThatFitsYourAnnotation.span
coordinate.latitude = coordinate.latitude - (span.latitudeDelta * 1/5) // 1/5 works well for my needs, adjust to your liking.
let shiftedRegion = MKCoordinateRegion(center: coordinate, span: span)
mapView.setRegion(shiftedRegion, animated: false)

我花了很多时间研究上面的答案,但没有得到有效的解决方案。

这是我得到的一个解决方案,它可以让您缩放到相当于地图视图 % 的偏移量。

https://gist.github.com/BrentMifsud/2b8ced4789e2c50e5269b1af60aa1717

因此,如果您希望一组注释显示在距离地图视图顶部 25% 的位置,您可以使用偏移量 0.25。或者 -0.25 如果你想让它出现在下半部分。

它也自动适用于风景。因此,如果您的 phone 是横向的,0.25 的偏移量会将注释缩放到屏幕的右侧。 -0.25 会将它们缩放到屏幕的左半部分。