我目前关注 this将多边形添加到 map 的教程。我需要能够向我的 map 添加多个多边形,所以我稍微更改了代码,以便我可以使用 addOverlays 来接收 IMKOverlay 对象数组,而不是一个 addOverlay 只接受一个 IMKOverlay 对象。
但这不起作用...它只在 map 上绘制第一个多边形!
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);
}
在 this讨论中,似乎每次我需要向 map 中添加另一个多边形时,我都必须调用 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;
}
Best Answer-推荐答案 strong>
每次调用 OverlayRenderer 时创建一个新的渲染器实例,不需要将渲染器缓存在类级别变量中,因为 MKMapView 会根据需要缓存渲染器.
子类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()}");
}
}
}
实例化并将委托(delegate)分配给您的 map :
mapDelegate = new MyMapDelegate();
map.Delegate = mapDelegate;
注意:将 MyMapDelegate 的实例存储在类级别变量中,因为您不想被 GC 处理
更新:
MKMapView 涉及在其 map 上显示叠加层的两个步骤。
1. Calling `AddOverlay` and `AddOverlays`
首先,您向 map 添加符合 IMKOverlay 的叠加层。有基本的内置类型,例如 MKCircle 、MKPolygon 等……但您也可以设计自己的叠加层;即定义恶劣天气(闪电、暴风云、 Tornado 等)位置的叠加层。这些 MKOverlays 描述了项目的地理位置但不如何绘制它。
2. Responding to `OverlayRenderer` requests
本地图的显示区域与其中一个叠加层相交时, map 需要将其绘制在屏幕上。调用 map 的委托(delegate)(您的 MKMapViewDelegate 子类)来提供一个 MKOverlayRenderer ,它定义了绘制例程以在 map 上绘制叠加层。
此绘图涉及使用 Core Graphics 例程(UIKit 可以使用但有一些限制)将叠加层的地理坐标转换为本地显示坐标(可以使用辅助方法)。 MKCircleRenderer、MKPolygonRenderer 等有基本的内置渲染器,可以使用,也可以编写自己的 MKOverlayRenderer 子类。
您可以提供一种自定义方式来渲染 MKCircle 叠加层,可能是目标样式的红/白多环靶心,而不是默认的圆形渲染器绘制它的方式,或者自定义渲染器在 MKPolygon 的范围内绘制强 Storm 符号以匹配您的自定义强 Storm 叠加层。
我的示例代码:
由于您使用 MKPolygon 来构建叠加层,因此您可以使用 MKPolygonRenderer 来显示它们。在我的示例中,我提供了一个模式匹配开关 (C# 6),它为您添加到 map 中的 每个 MKPolygon 返回一个半透明的红色/蓝色 MKPolygonRenderer(如果您添加了一个非基于 MKPolygon 的叠加层)它会抛出异常)。
关于c# - Xamarin - iOS map 上的多个多边形,我们在Stack Overflow上找到一个类似的问题:
https://stackoverflow.com/questions/46148371/
|