14

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

7 回答 7

17

我假设您确实MKMapViewDelegate通过以下语句在头文件中声明了委托@interface

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

self.mapView.delegate = self;
于 2013-09-21T20:52:20.140 回答
2

delegate就像其他人说的那样,请确保在添加它们之前设置您的。使用addOverlay:level:方法 sinceaddOverlay:将被弃用(根据标题中的注释)。

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

您也可以尝试登录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)

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

于 2016-01-01T18:00:06.090 回答
1

好的,我有同样的问题,终于找到了案例。我们必须使用[MKMapView addOverlay: level:]而不是[MKMapView addOverlay:]. 它触发rendererForOverlay而不是viewForOverlay委托。希望这对 iOS 7 爱好者有帮助!

于 2013-09-30T03:36:16.213 回答
1

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

于 2013-11-18T09:49:29.787 回答
0

对我来说,解决方案涉及两个步骤:

  1. 在添加覆盖之前先设置委托。一旦添加了叠加层,就会调用委托方法。
  2. 检查代表。愚蠢的是,我的代码中有一个名为 delegate 的本地属性。在 iOS 6 中,这无关紧要,在 iOS 7 中确实如此。一旦我删除了那个流浪的委托, rendererForOverlay: 就被调用了。
于 2014-07-08T10:59:46.440 回答
0

我刚刚用这种方法完成了我的实验,我发现只有nib-file 放置了 MKMapView@property (weak, nonatomic) IBOutlet MKMapView *mapView;修复了这个问题。这里还有清单

于 2014-03-08T06:59:25.710 回答
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)
于 2019-09-07T09:21:46.440 回答