Xamarin.ios 将多条多段线添加到MKMapView(Xamarin)
我扩展了@提供的示例,将多条多段线添加到地图中 使用一条多段线时一切都正常,但当我添加第二条多段线或在注释旁边添加多段线时,GetOverlyRenderer会出错并显示错误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
"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。如果你能把它拉上拉链送过去,我会快速看一看?如果是这样的话,我的详细信息就在我的个人资料上。我会直接给你发电子邮件,但这里有其他感兴趣的人的链接。。。这是一个稍微修改过的版本