Добавление 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 - это так. Так что я немного застрял с этой проблемой.

1 ответ

Решение

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

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

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

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

как сказано в отношении MKOverlayPathRenderer - это делает

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

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


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

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

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

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

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


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

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


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

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

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

Другие вопросы по тегам