Подтвердить что ты не робот

MKMapView - rendererForOverlay не вызывается

Недавно я начал изучать цель C и начал разрабатывать приложение в iOS6.

Теперь я пытаюсь преобразовать его для iOS7 и сталкиваться с проблемами с MKMap.

В iOS6 я использовал viewForOverlay.

В iOS7 я меняю его на renderForOverlay. Но мое приложение не вызывает mapView: rendererForOverlay. Ниже мой код. Ценю вашу помощь.

- (void) drawPolyline:(NSArray *)locations
{
    [mapView setDelegate:self];
    ...
    ...

    self.polyline = [MKPolyline polylineWithCoordinates:locationCoordinate2DArray count:numberOfLocations];
    free(locationCoordinate2DArray);
    [mapView addOverlay:self.polyline];
    [mapView setNeedsDisplay];
}

- (MKOverlayRenderer*)mapView:(MKMapView*)mapView rendererForOverlay:(id <MKOverlay>)overlay
{
    MKPolylineRenderer* lineView = [[MKPolylineRenderer alloc] initWithPolyline:self.polyline];
    lineView.strokeColor = [UIColor blueColor];
    lineView.lineWidth = 7;
    return lineView;
}
4b9b3361

Ответ 1

Я предполагаю, что вы делегировали делегат MKMapViewDelegate в файл заголовка через оператор @interface:

Однако назначил ли вы делегат в viewDidLoad (или где вы считаете его соответствующим)?

self.mapView.delegate = self;

Ответ 2

Как и многие другие, обязательно добавьте delegate прежде чем добавлять их. Используйте метод addOverlay:level: поскольку addOverlay: будет устаревшим (согласно комментарию в заголовке).

Моя проблема была чем-то немым. У меня были латы и долго перепутаны по ошибке для моих точек полигона. Не забудьте дважды проверить это, если они все еще не появляются.

Вы также можете попробовать logging pointCount на своем полигоне, чтобы убедиться, что они установлены правильно.

Связанный, вот как это делается в Swift:

// Get your coordinates from somewhere as an [CLLocationCoordinate2D] array
// If you already have them, make a local mutable copy
var coordinates = [CLLocationCoordinate2D]()

// Create your polygon
let polygon = MKPolygon(coordinates: &coordinates, count: coordinates.count)

Надеюсь, это сэкономит вам время!

Ответ 3

Хорошо, у меня была такая же проблема и, наконец, нашлось дело. Мы должны использовать [MKMapView addOverlay: level:] вместо [MKMapView addOverlay:]. Это вызывает rendererForOverlay а не viewForOverlay делегата. Надеюсь, это будет полезно для вас, любителей iOS 7!

Ответ 4

Если в locationCoordinate2DArray,mapView:rendererForOverlay есть только одна точка locationCoordinate2DArray,mapView:rendererForOverlay не будет вызываться.

Ответ 5

Я только что закончил эксперименты с этим методом, и я обнаружил, что только nib файл размещен MKMapView и @property (weak, nonatomic) IBOutlet MKMapView *mapView; исправлена эта проблема. Также здесь есть контрольный список.

Ответ 6

Для меня решение состояло из двух шагов:

  1. Сначала установите делегат, прежде чем добавлять наложение. Как только наложение будет добавлено, вызовут методы делегата.
  2. Проверьте делегата. Глупо, у меня было локальное свойство, называемое делегатом в моем коде. В iOS 6 это не имело значения, в iOS 7 это было сделано. Как только я удалил этого бродячего делегата, rendererForOverlay: получил вызов.

Ответ 7

Просто намек на таких как я, которые борются с IOS 13 на этом. Похоже, что IOS 13 игнорирует что-то вроде:

// self is a MKTileOverlayRenderer
// the code is called, if a method has produced a tile for a given MKMapRect

// tell the system that we are ready
DispatchQueue.main.async(execute: {

    // invalidate the mapRect
    self.setNeedsDisplay(mapRect)

})

Этот код работал нормально в IOS 10 - IOS 12, но теперь вам нужно добавить zoomScale в setNeedsDisplay(), в противном случае IOS 13, кажется, игнорируется... это стоило мне 4 часа, чтобы разобраться с этим; - )

self.setNeedsDisplay(mapRect, zoomScale: zoomScale)