下面的Monotouch代码不会导致异常,但也不会在地图上显示多边形。
var coords = new CLLocationCoordinate2D() { 新的CLLocationCoordinate2D(32.67,-81.9), 新的CLLocationCoordinate2D(32.77,-81.9), 新的CLLocationCoordinate2D(32.61,-81.9), 新的CLLocationCoordinate2D(32.43,-81.9), 新CLLocationCoordinate2D(32.67,-81.9) };
var mkp = MKPolygon.FromCoordinates(coords);
mapView.AddOverlay(MKP);
我将地图集中在coords [0]上,并且工作正常,带有coords [0]的SetRegion也是如此。使用coords [0],我可以将注释添加到MapView中。
我也尝试了相同的结果(没有错误,但没有显示叠加):
var mkc = MKCircle.Circle(coords [0],100);
mapView.AddOverlay(MKC);
想到MapView可能还没有“准备好”,我甚至尝试了一个等待一秒钟的线程,然后通过InvokeOnMainThread创建了Polygon。地图做了动画移动到coord,但仍然只是显示地图而没有叠加。
如果我加上这个:
var mkp = new MKPolygonView(mkp);
mapView.AddOverlay(mkpv);
我得到了这个例外:
“抛出Objective-C异常。名称:NSInvalidArgumentException原因: - [MKPolygonView boundingMapRect]无法识别的选择器发送到实例0x7579100”
我的坐标列表可能有问题吗?我已尝试使用列表末尾的第一个坐标来关闭多边形,没有它,结果相同。
由于
答案 0 :(得分:2)
将叠加对象添加到地图视图是不够的。您必须创建一个委托对象并实现GetViewForOverlay方法:
public class MapDelegate : MKMapViewDelegate
{
public override MKOverlayView GetViewForOverlay (MKMapView mapView, NSObject overlay)
{
MKPolygon polygon = overlay as MKPolygon;
if (null != polygon) // "overlay" is the overlay object you added
{
MKPolygonView polyView = new MKPolygonView(polygon);
// customize code for the MKPolygonView
return polyView;
}
return null;
}
}
然后,将此委托对象的新实例分配给地图视图的Delegate属性:
myMapView.Delegate = new MapDelegate();
您添加到地图视图的每个注释或叠加层都需要相应的视图。
您获得的异常是因为您要添加一个MKOverlayView派生对象,其中派生出一个MKOverlay。