将多条折线添加到MKMapView(Xamarin)

时间:2016-02-17 21:31:01

标签: xamarin.ios mkmapview xamarin.forms mkpolyline

我正在扩展提供@ https://developer.xamarin.com/recipes/cross-platform/xamarin-forms/maps/map-overlay/polyline/的示例,以便为我的地图添加多条折线。

使用单个折线可以正常工作,但是当我添加第二个折线时,或者在注释旁边添加折线时,GetOverlayRenderer错误输出错误

"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: 

我不明白为什么它适用于一条折线,但当我向地图添加任何其他内容时,它会失败(第一次通过该方法)

这是发生错误的整个方法。我可以提供更多代码,但它可以在一行中使用FINE,而不是两行。 (我遍历一个对象列表......如果有1个,那很好......如果有2个,它会失败)。

MKOverlayRenderer GetOverlayRenderer (MKMapView mapView, IMKOverlay overlay)
    {

        if (polylineRenderer == null) {
            try
            {

            polylineRenderer = new MKPolylineRenderer (overlay as MKPolyline);
            polylineRenderer.FillColor = UIColor.Blue;
            polylineRenderer.StrokeColor = UIColor.Red;
            polylineRenderer.LineWidth = 3;
            polylineRenderer.Alpha = 0.4f;
            }
            catch (Exception ex) {
            }
        }
        return polylineRenderer;
    }

4 个答案:

答案 0 :(得分:2)

对于代理人,您nativeMap.OverlayRenderer的设置请记住,这是为您添加的每个叠加层调用的。

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

然后您可以返回先前存储的MKOverlayRenderer,或者创建一个新的。{/ p>

当您尝试添加两个叠加层时代码失败的原因是因为您尝试为两个叠加层返回相同的渲染器,即{{1代码中的变量。

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

现在运行时,您会看到GetOverlayRenderer中的一个MKPolyline,另一个Red颜色。

在课堂范围内添加: -

Yellow

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

GetOverlayRenderer

更新1: -

如上所述,代码设计不好,仅用于说明一点。

是的 - 您可以重复使用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; } ,但请记住渲染器已分配给传递给您的代理人的特定MKOverlayRenderer

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

虽然您有一个现有的渲染器,但无法将其分配给作为IMKOverlay IMKOverlay属性传递到您的delgate的其他Overlay只读,这就是原因。

HTH。

答案 1 :(得分:0)

请试试这个:

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;
        }

答案 2 :(得分:0)

@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;
    }

他们在那里! Multiple Overlays

答案 3 :(得分:0)

这里的最终结果是传递给方法的叠加层是一个排序的包装器,你需要获得“handle”属性来获得实际的叠加层。

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

来源于https://forums.xamarin.com/discussion/31616/what-is-mkoverlaywrapper-its-breaking-my-map-renderer