c# - Xamarin - iOS map 上的多个多边形

标签 c# ios xamarin xamarin.ios xamarin.forms

我目前正在关注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;
  }

最佳答案

每次调用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 的叠加层。有基本的内置类型,例如 MKCircleMKPolygon 等……但您也可以设计自己的叠加层;即定义恶劣天气(闪电、暴风云、 Tornado 等)位置的叠加层。这些 MKOverlay 描述了项目的地理位置但不描述如何绘制它。

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/

相关文章:

ios - 如何在 Swift 中为 View 集合中的每个单元格添加弹出窗口

ios - 当从 uitableviewcell 按下 UIButton 时,如果有任何一个从其他单元格播放,则停止其他声音

ios - UITableView 应用程序在 cellForRow 委托(delegate)方法调用上崩溃

c# - WebService Post 在模拟器上工作但不在设备上工作

javascript - 如何在变量中插入动态多行文本框生成的值

c# - x => x + 1和x => x + = 1之间有区别吗?

c# - 如何使用 C# 代码和 XAML 在 xamarin.forms 中使用习语

azure - 哪些 Azure 存储功能可用于图像发布?

c# - 实现依赖注入(inject)静态方法

c# - Xamarin.Android 类未找到异常 'mono.android.app.Application'