viewforoverlay永远不会被调用

时间:2012-05-30 19:51:13

标签: ios mkmapview mkoverlay mkmapviewdelegate

这让我疯了。我已经浏览了stackoveflow上的所有帖子,但没有什么符合要求。我正在尝试添加一条简单的折线(即不是自定义叠加层)作为我MKMapView的叠加层。委托上的viewForOverlay方法永远不会被调用。为每个其他委托函数正确调用map委托。以下是viewForOverlay方法的代码:

//maanges the overlay
- (MKOverlayView *)mapView:(MKMapView *)map viewForOverlay:(id <MKOverlay>)overlay{

    NSLog(@"does it ask for the overlay view?");

    MKOverlayView *overlayView = nil;

    return overlayView;
}

以下是构建折线并将其添加到地图的代码:

    MKPolyline *thePolyline = [MKPolyline polylineWithPoints:pts count:[arrOfPoints count]];

    [thePolyline setTitle:@"line"];

    [mapView addOverlay:thePolyline];

折线确实有我的积分(大约1000),所以我认为问题不存在。我在地图视图中缺少一些必需的属性或其他实现吗?

编辑显示折线MKMapPoint生成的代码:

我使用一个大约1100点的xml文件来生成折线作为appConfig过程的一部分。我分别使用NSXMLParserNSXMLParserDelegate来阅读和解析文件。以下是生成点的代码(来自foundCharacters协议中的NSXMLParserDelegate方法):

//NSXMLParserDelegate methods...
- (void)parser:(NSXMLParser *)parser foundCharacters:(NSString *)string{

    if(POINT){
        NSArray *arr = [string componentsSeparatedByString:@","];

        MKMapPoint pt = MKMapPointMake([[arr objectAtIndex:1]doubleValue], [[arr objectAtIndex:0]doubleValue]);

        MapPointObject *thePoint = [[MapPointObject alloc] init];
        thePoint.mapPoint = pt;

        //gives the mkmappoint to the array of points.
        [arrOfPoints addObject:thePoint];

        [thePoint release];
    }
}

以下是点实际生成MKPolyline的位置并将其提供给mapView  (来自didEndElement协议的NSXMLParserDelegate方法):

   if([elementName isEqualToString:@"appConfig"]){
        MKMapPoint *pts = malloc([arrOfPoints count] * sizeof(MKMapPoint));

        for(int i = 0; i <= [arrOfPoints count] - 1; i++){
            MapPointObject *pointObject = [arrOfPoints objectAtIndex:i];
            pts[i] = pointObject.mapPoint;
        }

        MKPolyline *thePolyline = [MKPolyline polylineWithPoints:pts count:[arrOfPoints count]];
        [thePolyline setTitle:@"line"];

        //adding the polyline to the model's mapview
        Model *theModel = [Model sharedModel];

        [theModel.mapView setVisibleMapRect:thePolyline.boundingMapRect animated:YES];
        [theModel.mapView addOverlay:thePolyline];

        free(pts);
    }

MKPolyline上的点数属性确实表示其中有1100个点。

编辑示例XML值:

<appConfig>
<point>-94.847587,38.977967</point>
<point>-94.844111,38.977978</point>
<point>-94.844108,38.977369</point>
<point>-94.844003,38.977369</point>
<point>-94.843955,38.974886</point>

3 个答案:

答案 0 :(得分:2)

xml文件包含坐标(纬度和经度)值。这些坐标值与MKMapPoint值不同(这是地图视图的纬度/长度在平面地图上的x,y投影)。

您应该存储坐标而不是MKMapPoint值(您是)。

因此,不要使用MKMapPointpolylineWithPoints,而是使用CLLocationCoordinate2DpolylineWithCoordinates

在xml解析器方法中,使用CLLocationCoordinate2D创建并存储CLLocationCoordinate2DMake

pts数组的类型应为CLLocationCoordinate2D *,在执行malloc时,请使用sizeof(CLLocationCoordinate2D)

然后拨打polylineWithCoordinates而不是polylineWithPoints


顺便说一句,在进行上述更改后,您还需要在viewForOverlay内实际返回非零覆盖视图,否则您仍然看不到该行:

MKPolylineView *polylineView = [[[MKPolylineView alloc] initWithPolyline:overlay] autorelease];
polylineView.strokeColor = [UIColor redColor];
polylineView.lineWidth = 2.0;
return polylineView;

答案 1 :(得分:1)

我解决了问题,但鉴于@ AnnaKarenina的原始解决方案解决了问题,我将其标记为答案。我只是发布此信息,以便为其他任何人提供其他信息。

当我最初编写代码时,MKMapPointMake采用如下参数:MKMapPointMake(x,y)。当我切换它时,CLLocationCoordinate2DMake采用如下参数:CLLocationCoordinate2DMake(lat,lng)或笛卡尔术语CLLocationCoordinate2DMake(y,x)。对于我的特定坐标对,这不存在,因此它从不调用viewForOverlay委托方法。我改变了CLLocationCoordinate2DMake构造函数的参数顺序,现在一切正常。

答案 2 :(得分:1)

[self.mapView addOverlay:polyline];
[self.mapView setNeedsDisplay];

通过调用setNeedsDisplay强制刷新mapView:)