MKMapView - rendererForOverlay方法未被调用

14

我最近开始学习Objective-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;
}

程序没有调用mapView:rendererForOverlay函数。 - user2734323
7个回答

17

我假设您已经通过 @interface 语句在头文件中声明了 MKMapViewDelegate 代理:

但是,您是否在 viewDidLoad (或者您认为适当的地方) 方法中给该代理赋值了呢?

self.mapView.delegate = self;

是的,我在头文件中有委托... @interface MapTrackerViewController : UIViewController <MKMapViewDelegate, CLLocationManagerDelegate> { MKMapView *mapView; ... } 我已经在drawPolyline方法中分配了委托([mapView setDelegate:self];)。请在我的原始帖子中找到代码。它在iOS6中有效。在iOS7中,他们删除了viewforOverlay方法。现在,我正在尝试实现rendererForOverlay。但它没有被调用。 - user2734323

2

像其他人所说的那样,在添加叠加层之前确保设置了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)

希望这能为您节省一些时间!


1
谢谢!我也遇到了同样的问题。我把纬度和经度搞反了...! - Kevin Delord
哎呀!我也犯了同样的错误。唉,我的两个小时就这么浪费了。感谢你的帮助。 - fja

1
如果 locationCoordinate2DArray,mapView:rendererForOverlay 中只有一个点,则不会调用该方法。

1

好的,我曾经遇到过同样的问题,最终找到了解决方案。我们需要使用[MKMapView addOverlay:level:]而不是[MKMapView addOverlay:]。这将触发委托的rendererForOverlay而不是viewForOverlay。希望这对于喜欢iOS 7的您有所帮助!


好的,我还有另一个案例,我重写了MKMapView并且它转发了所有委托方法,例如mapView:viewForOverlay:而我不得不添加另一个mapView:rendererForOverlay的中继。 - Pei

0

我刚刚完成了使用这种方法的实验,并发现只有放置在nib文件中的MKMapView@property (weak, nonatomic) IBOutlet MKMapView *mapView;才能解决这个问题。此外,这里还有清单


0

对我来说,解决方案包括两个步骤:

  1. 在添加覆盖层之前先设置委托。一旦添加了覆盖层,委托方法将被调用。
  2. 检查委托。愚蠢的是,我的代码中有一个名为delegate的本地属性。在iOS 6中,这并不重要,在iOS 7中却很重要。一旦我删除了那个多余的委托,rendererForOverlay:就会被调用。

0

对于像我这样在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)

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接