Добавление MKOverlayPathRenderer в качестве наложения на MKMapView получает исключение

Все сказано в теме, так вот вот код

- (void)viewDidLoad { [super viewDidLoad]; // Do any additional setup after loading the view, typically from a nib. _pathRenderer = [[MKOverlayPathRenderer alloc] init]; _pathRenderer.lineWidth = 8.0f; _pathRenderer.strokeColor = [UIColor redColor]; _pathRenderer.path = CGPathCreateMutable(); [_mapView addOverlay:_pathRenderer]; } 

На последней строке это исключается:

  Terminating app due to uncaught exception 'NSInvalidArgumentException', reason: '-[MKOverlayPathRenderer boundingMapRect]: unrecognized selector 

Это означает, что я использую неправильный класс, который не реализует MKOverlay, я получил его, но, как сказано в ссылке MKOverlayPathRenderer, это так. Поэтому я немного застрял в этой проблеме.

    MKOverlayPathRenderer не реализует протокол MKOverlay .

    addOverlay требует объекта, который соответствует протоколу MKOverlay .

    Объект, который вы ему даете, не делает этого, и поэтому вы получаете это исключение (объекты, которые реализуют MKOverlay должны иметь свойство boundingMapRect ).

    В вашем вопросе утверждение:

    как сказано в ссылке MKOverlayPathRenderer – это

    не имеет смысла.

    В документации не говорится, что MKOverlayPathRenderer реализует MKOverlay . MKOverlayPathRenderer является подклассом MKOverlayRenderer и MKOverlayRenderer . Он соответствует только протоколу NSObject .

    MKOverlayPathRenderer рисует визуальное представление некоторого объекта наложения модели, который соответствует MKOverlay .

    Таким образом, требуется два отдельных объекта (подобно тому, как работают аннотации):

    1. Модель наложения – то, что реализует MKOverlay .
    2. Вид наложения – некоторый подкласс MKOverlayRenderer (или MKOverlayView до iOS 7).

    Процедура заключается в том, чтобы сначала дать MKMapView объект (ы) модели с помощью addOverlay: или addOverlays:

    Затем в методе делегирования rendererForOverlay , который будет отображать вид карты, когда он действительно хочет отобразить некоторый оверлей, вы создаете и возвращаете рендер ( представление ) для рассматриваемого наложения.

    Код, который у вас есть, который создает рендеринг, обычно находится в методе делегата rendererForOverlay и должен использовать метод initWithOverlay (вместо init ) и должен передать объект модели overlay для которого вы хотите создать средство визуализации.

    Для addOverlay вы создадите некоторый объект модели overlay – либо какой-то стандартный класс, как MKPolyline , MKPolygon , MKCircle или пользовательский класс.

    Но вы уверены, что вам нужен MKOverlayPathRenderer ?

    Если вы просто хотите нарисовать простую линию, круг или многоугольник, используйте уже созданные рендереры, которые автоматически рисуют эти объекты для вас. У вас будет намного меньше времени, чем создание собственного подкласса MKOverlayPathRenderer .

    MKPolylineRenderer , MKPolygonRenderer и MKCircleRenderer – это встроенные подклассы MKOverlayPathRenderer которые MKOverlayPathRenderer связанные с ними накладываемые модели без написания кода чертежа.

    Interesting Posts
    Давайте будем гением компьютера.