MKMapView - средство визуализации ForOverlay не вызывается
Недавно я начал изучать targetC и начал разрабатывать приложение для 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;
}
6 ответов
Я предполагаю, что вы объявили MKMapViewDelegate
делегировать в вашем заголовочном файле через @interface
заявление:
Тем не менее, вы назначили делегата в viewDidLoad
(или где вы считаете его подходящим) метод?
self.mapView.delegate = self;
Как уже говорили другие, убедитесь, что вы установили свой delegate
перед добавлением их. Использовать addOverlay:level:
метод с addOverlay:
будет объявлено устаревшим (согласно комментарию в шапке).
Моя проблема была чем-то глупым. Я долго и по ошибке переключался на точки своего многоугольника. Убедитесь, что перепроверили это, если они все еще не обнаруживаются.
Вы также можете попробовать войти 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)
Надеюсь, это сэкономит вам время!
Если есть только одна точка в locationCoordinate2DArray,mapView:rendererForOverlay
не будет называться.
ОК, у меня возникла та же проблема, и я наконец нашел дело. Мы должны использовать [MKMapView addOverlay: level:]
вместо [MKMapView addOverlay:]
, Это вызывает rendererForOverlay
скорее, чем viewForOverlay
делегата. Надеюсь, это будет полезно для вас, любителей iOS 7!
Для меня решение состояло из двух шагов:
- Сначала установите делегат, прежде чем добавлять оверлей. Как только наложение будет добавлено, будут вызваны методы делегата.
- Проверьте делегата. Глупо, у меня было локальное свойство под названием делегат в моем коде. В iOS 6 это не имело значения, в iOS 7 это имело значение. Как только я удалил этот случайный делегат, был вызван rendererForOverlay:.
Я только что закончил свои эксперименты с этим методом и обнаружил, что только nib-файл помещает MKMapView и @property (weak, nonatomic) IBOutlet MKMapView *mapView;
исправил эту проблему. Также здесь есть контрольный список.
Просто намек для таких, как я, которые борются с 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)