所以我想显示我的应用用户在MKMapView
上走的位置,我使用以下代码收集数据:
#pragma mark - CLLocationManagerDelegate
- (void)locationManager:(CLLocationManager *)manager
didUpdateToLocation:(CLLocation *)newLocation
fromLocation:(CLLocation *)oldLocation {
// calc. distance walked
CLLocationDistance meters = [newLocation distanceFromLocation:oldLocation];
self.totalMetters += meters;
[[self labelDistance] setText:[self formatDistanceIntoString:self.totalMetters]];
// create another annotation
MKPointAnnotation *annotation = [[MKPointAnnotation alloc] init];
annotation.coordinate = newLocation.coordinate;
// Also add to our map so we can remove old values later
[self.locations addObject:annotation];
// Remove values if the array is too big
while (self.locations.count > 100)
{
annotation = [self.locations objectAtIndex:0];
[self.locations removeObjectAtIndex:0];
// Also remove from the map
[self.map removeAnnotation:annotation];
}
一旦完成,我称之为绘制方法:
[self drawRoute];
其中包含以下内容:
- (void)drawRoute {
NSLog(@"drawRoute");
NSInteger pointsCount = self.locations.count;
CLLocationCoordinate2D pointsToUse[pointsCount];
for(int i = 0; i < pointsCount; i++) {
MKPointAnnotation *an = [self.locations objectAtIndex:i];
pointsToUse[i] = CLLocationCoordinate2DMake(an.coordinate.latitude,an.coordinate.latitude);
}
MKPolyline *myPolyline = [MKPolyline polylineWithCoordinates:pointsToUse count:pointsCount];
[self.map addOverlay:myPolyline];
}
最后我的mapView
代表:
- (MKOverlayView *)mapView:(MKMapView *)mapView viewForOverlay:(id <MKOverlay>)overlay {
NSLog(@"route");
if ([overlay isKindOfClass:MKPolyline.class]) {
MKPolylineView *lineView = [[MKPolylineView alloc] initWithOverlay:overlay];
lineView.strokeColor = [UIColor greenColor];
return lineView;
}
return nil;
}
显然我的控制器是MKMapView
代表符合
@interface NewWalkViewController : UIViewController <CLLocationManagerDelegate, MKMapViewDelegate>
mapView
中的Storyboard
链接到控制器(插座和代理)
我使用“自行车道”调试工具,输出结果为:
2014-01-25 20:27:30.132遛狗[2963:70b]新址:37.330435
2014-01-25 20:27:30.133遛狗[2963:70b] drawRoute
正如我所看到的,从未调用过绘制叠加层的方法,我没有一个线索如何修复它。
答案 0 :(得分:3)
主要问题是在drawRoute
中,此行将latitude
两个参数传递给CLLocationCoordinate2DMake
:
pointsToUse[i] = CLLocationCoordinate2DMake
(an.coordinate.latitude,an.coordinate.latitude);
这导致在世界的不同部分绘制线条而不是实际an.coordinate
。例如,如果an.coordinate
是37,-122(旧金山附近的某个地方),则该线将被绘制为37,37(土耳其南部某处)。
由于您实际上并未将地图定位在错误的位置(您正在寻找“正确”位置的线条),因此地图永远不会调用viewForOverlay
,因为地图仅在覆盖可能时调用它将是可见的。
将该行更改为:
pointsToUse[i] = CLLocationCoordinate2DMake
(an.coordinate.latitude,an.coordinate.longitude);
或简单地说:
pointsToUse[i] = an.coordinate;
正如James Frost在评论中提到的那样,从iOS 7开始,您应该使用rendererForOverlay
代替viewForOverlay
,但如果viewForOverlay
地图视图仍会在iOS 7中调用rendererForOverlay
尚未实施。虽然这不会阻止您的叠加层在当前情况下显示,但您应该实现新的委托方法以及旧的委托方法(如果iOS 7应用程序也将在iOS 6或更早版本上运行)。
另一个重要但不相关的问题是您不必要地创建多个重叠的叠加层。在drawRoute
中,由于您要创建的叠加层包含所有位置,因此您应该在添加新叠加层之前删除所有叠加层。否则,地图最终会显示位置0到1的叠加层,位置0到位置2的叠加层,位置0到位置3的叠加层等。之前的叠加层显然不可见,因为它们具有相同的颜色和线条宽度。在addOverlay
行之前,请填写:
[self.map removeOverlays:self.map.overlays];