MKMapView - 未调用rendererForOverlay

时间:2013-09-20 00:12:37

标签: ios mkmapview mkpolyline

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

7 个答案:

答案 0 :(得分:15)

我假设您通过MKMapViewDelegate声明在头文件中声明了@interface委托:

但是,您是否在viewDidLoad(或您认为合适的地方)方法中分配了代理?

self.mapView.delegate = self;

答案 1 :(得分:2)

与其他人一样,请确保在添加delegate之前设置它们。使用addOverlay:level:方法,因为addOverlay:将被弃用(根据标题中的注释)。

我的问题是愚蠢的。因为我的多边形点,我错误地转换了lat和long。如果他们仍然没有出现,请务必仔细检查。

您也可以尝试在多边形上记录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)

希望这可以节省你一些时间!

答案 2 :(得分:1)

好的,我有同样的问题,最后找到了案子。 我们必须使用[MKMapView addOverlay: level:]而不是[MKMapView addOverlay:]。 它触发rendererForOverlay而不是代理的viewForOverlay。 希望这对iOS 7爱好者有所帮助!

答案 3 :(得分:1)

如果locationCoordinate2DArray,mapView:rendererForOverlay中只有一个点不会被调用。

答案 4 :(得分:0)

我刚用这个方法完成了实验,我发现只有 nib文件放置MKMapView @property (weak, nonatomic) IBOutlet MKMapView *mapView;修复了这个问题。这里也是checklist

答案 5 :(得分:0)

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

  1. 在添加叠加层之前先设置委托。添加叠加层后,将立即调用委托方法。
  2. 检查代表。愚蠢的是,我的代码中有一个名为delegate的本地属性。在iOS 6中,它没有关系,在iOS 7中它确实如此。一旦我删除了那个迷路委托,rendererForOverlay就被调用了。

答案 6 :(得分: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)