2

注意:如果此问题需要更多信息,请添加评论。

细节:

我想在 MKMapView 上生成围绕美国大陆的边界线。这个想法是开始在国家轮廓之外的区域上绘制叠加层(我需要不强调外部区域,只是让美国成为主要焦点;我正在考虑模糊效果,但愿意接受有关实施或实现目标的其他方法)。

背景:

我需要模糊(或淡化)出现在默认 MKMapView 中的其他国家,而不是美国大陆。

我的初步方法:

  1. 使用折线识别连续的国家边界框(类似于在地图上表示公交路线的方式;我注意到似乎有一些默认线〜有什么方法可以访问这些坐标?)
  2. 确定一种使用带有模糊的 UIVisualEffectView 来掩盖地图的方法(或任何其他使地图的该部分不在边界内变暗的可能性)

我不一定需要代码解决方案(尽管如果发布,我会尝试)。我想知道在这方面有经验的人是否可以提供伪代码或只是一些关于采取此过程的最佳方法的指针。

其他研究:

我查看了其他资源,包括MapKit 文档和这个覆盖教程

4

1 回答 1

1

您需要在所有 MKMapView 周围绘制一个多边形,其中包含一个内部多边形,该区域是您不想模糊的区域。这是我的解决方案:

首先,您需要坐标来覆盖地图的每一部分:

struct WorldCoordinates {
    static let values = [
        CLLocationCoordinate2D(latitude: 90, longitude: 0),
        CLLocationCoordinate2D(latitude: 90, longitude: 180),
        CLLocationCoordinate2D(latitude: -90, longitude: 180),
        CLLocationCoordinate2D(latitude: -90, longitude: 0),
        CLLocationCoordinate2D(latitude: -90, longitude: -180),
        CLLocationCoordinate2D(latitude: 90, longitude: -180)
    ]
}

然后使用类似这样的方法添加内部和外部多边形:请注意,我使用“City”作为结构的示例,其中 boundigCoordinatesArray 是您不想模糊的区域的边界坐标数组。

func addCityBoundingPolygon(in mapView: MKMapView, with city: City) {
    // Declare your inner polygon
    let innerPolygon = MKPolygon(coordinates: city.boundingCoordinatesArray, count: city.boundingCoordinatesArray.count)
    innerPolygon.title = "\(city.id)"
        
    // Declare your outer polygon with previously created inner polygon
    let outerPolygon = MKPolygon(coordinates: WorldCoordinates.values, count: WorldCoordinates.values.count, interiorPolygons: [innerPolygon])
        
    mapView.addOverlay(outerPolygon)    
}

最后在 MKMapViewDelegate 上添加外部多边形的颜色,如下所示:

func mapView(_ mapView: MKMapView, rendererFor overlay: MKOverlay) -> MKOverlayRenderer {
    if let polygon = overlay as? MKPolygon {
        let renderer = MKPolygonRenderer(polygon: polygon)
        renderer.fillColor = UIColor.outOfCityBounds().withAlphaComponent(0.1)
        renderer.strokeColor = UIColor.outOfCityBounds().withAlphaComponent(0.4)
        renderer.lineWidth = 1
        return renderer
    }

    return MKOverlayRenderer()
}

使用这种方法,您将能够重新创建如下内容: 城市应用程序

于 2020-09-04T02:46:01.723 回答