MKPolygon не показывает & MKPolygonView исключения - PullRequest
2 голосов
/ 06 июня 2011

Этот код Monotouch, приведенный ниже, не вызовет исключения, но он также не будет отображать многоугольник на карте.

var ords = new CLLocationCoordinate2D () {new 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)};

mPP.FromCoordinates (координаты);

mapView.AddOverlay (mkp);

Я центрировал карту по координатам [0], и это прекрасно работает, как и SetRegion с координатами [0].Используя координаты [0], у меня нет проблем с добавлением аннотации в MapView.

Я также пробовал это делать с теми же результатами (без ошибок, но без наложения):

var mkc = MKCircle.Circle (ords [0], 100);

mapView.AddOverlay (mkc);

Считая, что, возможно, MapView еще не был «готов»,Я даже попробовал поток, который ждал секунду, а затем создал полигон через InvokeOnMainThread.Карта сделала анимированное перемещение к координатам, но все равно просто показала карту и не наложила.

Если я добавлю это:

var mkp = new MKPolygonView (mkp);

mapView.AddOverlay (mkpv);

Я получаю это исключение:

"Возникло исключение Objective C. Имя: NSInvalidArgumentException Причина: - [MKPolygonViewboundingMapRect] нераспознанный селектор, отправленный экземпляру 0x7579100 "

Возможно, есть проблема с моим списком координат?Я пытался с первой координатой в конце списка, чтобы закрыть многоугольник, и без этого, с теми же результатами.

Спасибо

1 Ответ

2 голосов
/ 06 июня 2011

Добавление наложенного объекта на карту недостаточно.Вы должны создать объект делегата и реализовать метод 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.

...