Xamarin.ios 将多条多段线添加到MKMapView(Xamarin)

Xamarin.ios 将多条多段线添加到MKMapView(Xamarin),xamarin.ios,mkmapview,xamarin.forms,mkpolyline,Xamarin.ios,Mkmapview,Xamarin.forms,Mkpolyline,我扩展了@提供的示例,将多条多段线添加到地图中 使用一条多段线时一切都正常,但当我添加第二条多段线或在注释旁边添加多段线时,GetOverlyRenderer会出错并显示错误 "Value cannot be null.Parameter name: polyline" 它在网上出错了: polylineRenderer = new MKPolylineRenderer (overlay as MKPolyline); 当我看叠加对象时,它是: {MapKit.MKOverlayWrappe

我扩展了@提供的示例,将多条多段线添加到地图中

使用一条多段线时一切都正常,但当我添加第二条多段线或在注释旁边添加多段线时,GetOverlyRenderer会出错并显示错误

"Value cannot be null.Parameter name: polyline"
它在网上出错了:

polylineRenderer = new MKPolylineRenderer (overlay as MKPolyline);
当我看叠加对象时,它是:

{MapKit.MKOverlayWrapper}
BoundingMapRect: {{{62634939.7333333, 111606556.311973}, {745654.044444449, 848491.772016793}}}
Coordinate: {CoreLocation.CLLocationCoordinate2D}
Handle: 0x791ca560
Non-public members: 
我不明白为什么它只适用于一条多段线,但当我向地图添加任何其他内容时,它失败了(也是第一次通过该方法)

下面是发生错误的整个方法。我可以提供更多的代码,但一行代码就可以了,而不是两行代码。(我在一个对象列表中循环……如果有1个,就可以了……如果有2个,就失败了)

请试试这个:

public override MKOverlayView GetViewForOverlay(MKMapView mapView, IMKOverlay overlay)
        {
            if (overlay is MKPolyline)
            {
                // return a view for the polygon
                MKPolyline l_polyline = overlay as MKPolyline;
                MKPolylineView l_polylineView = new MKPolylineView(l_polyline);
                MKPolylineRenderer l_polylineRenderer = new MKPolylineRenderer(l_polyline);

                l_polylineView.FillColor = UIColor.Blue;
                l_polylineView.StrokeColor = UIColor.Red;

                return l_polylineView;
            }

            return null;
        }
请试试这个:

public override MKOverlayView GetViewForOverlay(MKMapView mapView, IMKOverlay overlay)
        {
            if (overlay is MKPolyline)
            {
                // return a view for the polygon
                MKPolyline l_polyline = overlay as MKPolyline;
                MKPolylineView l_polylineView = new MKPolylineView(l_polyline);
                MKPolylineRenderer l_polylineRenderer = new MKPolylineRenderer(l_polyline);

                l_polylineView.FillColor = UIColor.Blue;
                l_polylineView.StrokeColor = UIColor.Red;

                return l_polylineView;
            }

            return null;
        }

对于代理,请为
nativeMap.OverlayRenderer
设置,记住这是为添加的每个覆盖调用的

调用此委托时,将向其传递与其相关的
IMKOverlay

然后,您可以返回以前存储的
mkoverlayrender
,也可以创建一个新的

当您尝试添加两个覆盖时,代码失败的原因是您试图为两个覆盖返回相同的渲染器,即代码中的
polylineRenderer

仅出于演示目的,我将您的
getoverlayrender
修改为以下内容。这不是一个好的设计,但说明了我在上面提出的观点

现在运行此操作时,您将看到一条
MKPolyline
呈红色,另一条呈黄色

在类别范围中添加此项:-

private bool cblnIsTest = false;
然后将
GetOverlayRenderer
修改为以下内容:-

MKOverlayRenderer GetOverlayRenderer(MKMapView mapView, IMKOverlay overlay)
{
    MKPolylineRenderer polylineRenderer2 = new MKPolylineRenderer(overlay as MKPolyline);

    if (!cblnIsTest)
    {
        cblnIsTest = true;
        //
        polylineRenderer2.StrokeColor = UIColor.Yellow;
    }
    else
    {
        polyline Renderer.StrokeColor = UIColor.Red;
    }
    polylineRenderer2.LineWidth = 3;
    polylineRenderer2.Alpha = 0.4f;
    //
    return polylineRenderer2;
}
更新1:-

如上所述,代码不是很好的设计,只是为了说明一点

是-您可以重复使用
mkoverlayrender
,但是请记住,渲染器被分配给传递给您的代理的特定
IMKOverlay

您正在尝试对多个IMKOverlay使用相同的渲染器。这是不可能的

尽管您有一个现有的渲染器,无法将其指定给另一个
IMKOverlay
,该渲染器将作为
mkoverlayrender
Overlay
属性为只读,这就是原因


HTH.

对于代理,请为
nativeMap.OverlayRenderer
设置,记住这是为添加的每个覆盖调用的

调用此委托时,将向其传递与其相关的
IMKOverlay

然后,您可以返回以前存储的
mkoverlayrender
,也可以创建一个新的

当您尝试添加两个覆盖时,代码失败的原因是您试图为两个覆盖返回相同的渲染器,即代码中的
polylineRenderer

仅出于演示目的,我将您的
getoverlayrender
修改为以下内容。这不是一个好的设计,但说明了我在上面提出的观点

现在运行此操作时,您将看到一条
MKPolyline
呈红色,另一条呈黄色

在类别范围中添加此项:-

private bool cblnIsTest = false;
然后将
GetOverlayRenderer
修改为以下内容:-

MKOverlayRenderer GetOverlayRenderer(MKMapView mapView, IMKOverlay overlay)
{
    MKPolylineRenderer polylineRenderer2 = new MKPolylineRenderer(overlay as MKPolyline);

    if (!cblnIsTest)
    {
        cblnIsTest = true;
        //
        polylineRenderer2.StrokeColor = UIColor.Yellow;
    }
    else
    {
        polyline Renderer.StrokeColor = UIColor.Red;
    }
    polylineRenderer2.LineWidth = 3;
    polylineRenderer2.Alpha = 0.4f;
    //
    return polylineRenderer2;
}
更新1:-

如上所述,代码不是很好的设计,只是为了说明一点

是-您可以重复使用
mkoverlayrender
,但是请记住,渲染器被分配给传递给您的代理的特定
IMKOverlay

您正在尝试对多个IMKOverlay使用相同的
渲染器。这是不可能的

尽管您有一个现有的渲染器,无法将其指定给另一个
IMKOverlay
,该渲染器将作为
mkoverlayrender
Overlay
属性为只读,这就是原因


嗯。

@Pete,现在我明白了,这就成功了。对于我丑陋的演示,这里是我的目的。它会在每次调用时创建一个新的渲染器。。。不是很好的形式,但它演示了您所做的代码-本质上,我将渲染器的作用域从跨类移动到每次请求时都重新创建。。。糟糕的形式,我会清理它以重用渲染器,但它完成了演示/理解的工作

    MKOverlayRenderer GetOverlayRenderer (MKMapView mapView, IMKOverlay overlay)
    {
        //Moved the renderer here instead of being scoped at the class
        MKPolylineRenderer polylineRenderer= new MKPolylineRenderer (overlay as MKPolyline);
        polylineRenderer.FillColor = UIColor.Blue;
        polylineRenderer.StrokeColor = UIColor.Red;
        polylineRenderer.LineWidth = 3;
        polylineRenderer.Alpha = 0.4f;
        return polylineRenderer;
    }
他们就在那里!
@Pete,现在我明白了,这就成功了。对于我丑陋的演示,这里是我的目的。它会在每次调用时创建一个新的渲染器。。。不是很好的形式,但它演示了您所做的代码-本质上,我将渲染器的作用域从跨类移动到每次请求时都重新创建。。。糟糕的形式,我会清理它以重用渲染器,但它完成了演示/理解的工作

    MKOverlayRenderer GetOverlayRenderer (MKMapView mapView, IMKOverlay overlay)
    {
        //Moved the renderer here instead of being scoped at the class
        MKPolylineRenderer polylineRenderer= new MKPolylineRenderer (overlay as MKPolyline);
        polylineRenderer.FillColor = UIColor.Blue;
        polylineRenderer.StrokeColor = UIColor.Red;
        polylineRenderer.LineWidth = 3;
        polylineRenderer.Alpha = 0.4f;
        return polylineRenderer;
    }
他们就在那里!

这里的最终结果是,传递给该方法的覆盖是一个排序包装,您需要获取“handle”属性以获取实际的覆盖

public override MKOverlayView GetViewForOverlay (MKMapView mapView, IMKOverlay overlayWrapper)
    {
    if (overlayWrapper != null) {
    var overlay = Runtime.GetNSObject(overlayWrapper.Handle) as MKOverlay;
    // Do Overlay Functions here
    }

其来源于

这里的最终结果是传递给该方法的覆盖是一个排序包装,您需要获取“handle”属性来获取实际的覆盖

public override MKOverlayView GetViewForOverlay (MKMapView mapView, IMKOverlay overlayWrapper)
    {
    if (overlayWrapper != null) {
    var overlay = Runtime.GetNSObject(overlayWrapper.Handle) as MKOverlay;
    // Do Overlay Functions here
    }

这可能是一个bug。如果你能把它拉上拉链送过去,我会快速看一看?如果是这样的话,我的详细信息就在我的个人资料上。我会直接给你发电子邮件,但这里有其他感兴趣的人的链接。。。这是一个稍微修改过的版本