这让我发疯了。我已经浏览了 stackoveflow 上的所有帖子,但没有任何内容符合要求。我正在尝试添加一个简单的折线(即不是自定义叠加)作为我的 MKMapView
的叠加。委托(delegate)上的 viewForOverlay
方法永远不会被调用。 map 委托(delegate)被正确地为所有其他委托(delegate)函数调用。以下是 viewForOverlay
方法的代码:
//maanges the overlay
- (MKOverlayView *)mapViewMKMapView *)map viewForOverlayid <MKOverlay>)overlay{
NSLog(@"does it ask for the overlay view?");
MKOverlayView *overlayView = nil;
return overlayView;
}
这是我构造折线并将其添加到 map 的代码:
MKPolyline *thePolyline = [MKPolyline polylineWithPoints:pts count:[arrOfPoints count]];
[thePolyline setTitle"line"];
[mapView addOverlay:thePolyline];
实际上,折线确实有我的点集合(大约 1000 个),所以我认为问题不存在。我是否缺少 map View 上的某些必需属性或其他一些实现?
EDIT 显示折线 MKMapPoint
生成的代码:
我使用一个包含大约 1100 个点的 xml 文件来生成折线,作为 appConfig 过程的一部分。我分别使用 NSXMLParser
和 NSXMLParserDelegate
读取和解析文件。下面是生成点的代码(来自 NSXMLParserDelegate
协议(protocol)中的 foundCharacters
方法):
//NSXMLParserDelegate methods...
- (void)parserNSXMLParser *)parser foundCharactersNSString *)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 的位置
(来自 NSXMLParserDelegate
协议(protocol)上的 didEndElement
方法):
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>
xml 文件包含坐标(纬度和经度)值。这些坐标值与 MKMapPoint
值( map View 的纬度/经度在平面 map 上的 x,y 投影)不同。
你应该存储坐标而不是 MKMapPoint
值(你是)。
所以不要使用 MKMapPoint
和 polylineWithPoints
,而是使用 CLLocationCoordinate2D
和 polylineWithCoordinates
。
在xml解析器方法中,使用CLLocationCoordinate2DMake
创建并存储一个CLLocationCoordinate2D
。
pts
数组的类型应该是 CLLocationCoordinate2D *
并且在执行 malloc
时,使用 sizeof(CLLocationCoordinate2D)
.
然后调用 polylineWithCoordinates
而不是 polylineWithPoints
。
顺便说一句,在进行上述更改后,您还需要在 viewForOverlay
中实际返回一个非零覆盖 View ,否则您仍然看不到该行:
MKPolylineView *polylineView = [[[MKPolylineView alloc] initWithPolylineverlay] autorelease];
polylineView.strokeColor = [UIColor redColor];
polylineView.lineWidth = 2.0;
return polylineView;
关于ios - viewforoverlay 永远不会被调用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10823257/
欢迎光临 OStack程序员社区-中国程序员成长平台 (https://ostack.cn/) | Powered by Discuz! X3.4 |