• 设为首页
  • 点击收藏
  • 手机版
    手机扫一扫访问
    迪恩网络手机版
  • 关注官方公众号
    微信扫一扫关注
    迪恩网络公众号

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

[复制链接]
菜鸟教程小白 发表于 2022-12-13 15:38:58 | 显示全部楼层 |阅读模式 打印 上一主题 下一主题

我目前关注 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-推荐答案


每次调用 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 等)位置的叠加层。这些 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/

回复

使用道具 举报

懒得打字嘛,点击右侧快捷回复 【右侧内容,后台自定义】
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

关注0

粉丝2

帖子830918

发布主题
阅读排行 更多
广告位

扫描微信二维码

查看手机版网站

随时了解更新最新资讯

139-2527-9053

在线客服(服务时间 9:00~18:00)

在线QQ客服
地址:深圳市南山区西丽大学城创智工业园
电邮:jeky_zhao#qq.com
移动电话:139-2527-9053

Powered by 互联科技 X3.4© 2001-2213 极客世界.|Sitemap