Xamarin – iOS在地图上的多个多边形

我目前正在按照这个教程向地图添加一个多边形。 我需要能够添加多个多边形到我的地图,所以我稍微改变了代码,以便我可以使用addOverlays ,它接受一组IMKOverlay对象,而不是一个addOverlayaddOverlay需要一个IMKOverlay对象。

这不起作用,但它只绘制地图上的第一个多边形!

 void addPolygonsToMap() { overlayList = new List<IMKOverlay>(); for (int i = 0; i < polygons.Count; i++) { CLLocationCoordinate2D[] coords = new CLLocationCoordinate2D[polygons[i].Count]; int index=0; foreach (var position in polygons[i]) { coords[index] = new CLLocationCoordinate2D(position.Latitude, position.Longitude); index++; } var blockOverlay = MKPolygon.FromCoordinates(coords); overlayList.Add(blockOverlay); } IMKOverlay[] imko = overlayList.ToArray(); nativeMap.AddOverlays(imko); } 

在这个讨论中,似乎每次我需要向我的地图添加另一个多边形时,都必须调用一个MKPolygonRenderer的新实例,但是我不确定这个示例如何转换为我的代码。 这是我的MKPolygonRenderer函数:

 MKOverlayRenderer GetOverlayRenderer(MKMapView mapView, IMKOverlay overlayWrapper) { if (polygonRenderer == null && !Equals(overlayWrapper, null)) { var overlay = Runtime.GetNSObject(overlayWrapper.Handle) as IMKOverlay; polygonRenderer = new MKPolygonRenderer(overlay as MKPolygon) { FillColor = UIColor.Red, StrokeColor = UIColor.Blue, Alpha = 0.4f, LineWidth = 9 }; } return polygonRenderer; } 

每次调用OverlayRendererOverlayRenderer创build一个新的渲染器实例,因此不需要将渲染器caching在类级variables中,因为MKMapView将根据需要caching渲染器。

子类MKMapViewDelegate

 class MyMapDelegate : MKMapViewDelegate { public override MKOverlayRenderer OverlayRenderer(MKMapView mapView, IMKOverlay overlay) { switch (overlay) { case MKPolygon polygon: var prenderer = new MKPolygonRenderer(polygon) { FillColor = UIColor.Red, StrokeColor = UIColor.Blue, Alpha = 0.4f, LineWidth = 9 }; return prenderer; default: throw new Exception($"Not supported: {overlay.GetType()}"); } } } 

实例并将该委托分配给您的地图:

 mapDelegate = new MyMapDelegate(); map.Delegate = mapDelegate; 

注意:将您的MyMapDelegate的实例存储在一个类级variables中,因为您不想获取GC'd

更新:

MKMapView有两个步骤在地图上显示覆盖图。

 1. Calling `AddOverlay` and `AddOverlays` 

首先,为符合IMKOverlay的地图添加叠加层。 有基本的内置types,如MKCircleMKPolygon等…但你也可以devise自己的覆盖; 即定义恶劣天气(闪电,暴风云,龙卷风等)位置的覆盖图。 这些MKOverlay描述物品的地理位置, 而不是如何绘制它。

 2. Responding to `OverlayRenderer` requests 

当地图的显示区域与其中一个叠加层相交时,地图需要在屏幕上绘制。 地图的委托(你的MKMapViewDelegate子类)被调用来提供一个MKOverlayRenderer ,它定义绘制例程在地图上绘制覆盖图。

此graphics涉及使用Core Graphics例程(UIKit可以使用有一些限制)将覆盖的地理坐标转换为本地显示坐标(辅助方法可用)。 有MKCircleRenderer,MKPolygonRenderer等基本的内置渲染器,可以使用,或者你可以写你自己的MKOverlayRenderer子类。

你可以提供一种自定义的方式来呈现一个MKCircle覆盖层,也许是一个目标风格的红色/白色多环形靶心,而不是默认的圆形渲染器绘制的方式,或者是在MKPolygon边界内绘制严重风暴符号的自定义渲染器以匹配您的自定义严重风暴覆盖。

我的示例代码:

由于您使用MKPolygon来构build覆盖图,因此可以使用MKPolygonRenderer来显示它们。 在我的示例中,我提供了一个模式匹配开关(C#6),为您添加到地图上的每个 MKPolygon返回一个半透明的红色/蓝色MKPolygonRenderer(如果添加了非MKPolygon的叠加层,将引发exception)。