Добавление 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
,
Таким образом, требуется два отдельных объекта (аналогично тому, как работают аннотации):
- Модель наложения - то, что реализует
MKOverlay
, - Вид наложения - некоторый подкласс
MKOverlayRenderer
(или жеMKOverlayView
до iOS 7).
Процедура состоит в том, чтобы сначала дать MKMapView
модельные объекты, использующие addOverlay:
или же addOverlays:
методы.
Тогда в rendererForOverlay
Метод делегата, который будет вызывать представление карты, когда он действительно хочет отобразить некоторое наложение, вы создаете и возвращаете средство визуализации (представление) для рассматриваемого наложения.
Код, который у вас есть для создания рендера, обычно находится в rendererForOverlay
метод делегата и должен использовать initWithOverlay
метод (вместо init
) и должен пройти overlay
объект модели, для которого вы хотите создать рендерер.
Для addOverlay
, вы бы создали некоторый объект модели наложения - либо какой-то стандартный класс, например MKPolyline
, MKPolygon
, MKCircle
или пользовательский класс.
Но вы уверены, что вам нужно MKOverlayPathRenderer
?
Если вы просто хотите нарисовать простую линию, окружность или многоугольник, используйте уже предоставленные средства визуализации, которые автоматически рисуют эти объекты для вас. Вам будет гораздо проще, чем создать свой собственный подкласс MKOverlayPathRenderer
,
MKPolylineRenderer
, MKPolygonRenderer
, а также MKCircleRenderer
встроенные подклассы MKOverlayPathRenderer
которые рисуют их связанные наложения модели без написания кода для рисования.