2

这是代码。它非常简单。我正在为正在行走的人开辟道路。所以,这是我的ViewController.m文件的代码:

#import "ViewController.h"

@interface ViewController ()

@property BOOL firstTime;

@end

@implementation ViewController

- (void)viewDidLoad
{
    [super viewDidLoad];
    // Do any additional setup after loading the view, typically from a nib.
    [self.mapView setDelegate:self];
    [self.mapView setShowsUserLocation:YES];
    [self.mapView setMapType:MKMapTypeHybrid];

    [self setLocationManager:[[CLLocationManager alloc] init]];
    [self.locationManager setDelegate:self];
    [self.locationManager setDistanceFilter:kCLDistanceFilterNone];
    [self.locationManager setDesiredAccuracy:kCLLocationAccuracyBest];
    [self.locationManager startUpdatingLocation];

    self.index = 0;

    self.firstTime = YES;
}

- (void)didReceiveMemoryWarning
{
    [super didReceiveMemoryWarning];
    // Dispose of any resources that can be recreated.
}

- (void)locationManager:(CLLocationManager *)manager didUpdateLocations:(NSArray *)locations
{
    if(self.firstTime)
    {
        CLLocation *startingLocation = [locations objectAtIndex:0];
        self.startingPointCooridinates = startingLocation.coordinate;
        self.index++;

        MKPointAnnotation *startingPointAnnotation = [[MKPointAnnotation alloc] init];
        startingPointAnnotation.title = @"Starting Point";
        startingPointAnnotation.coordinate = startingLocation.coordinate;

        [self.mapView addAnnotation:startingPointAnnotation];

        self.firstTime = false;
    }

    [self.locations addObject:[locations objectAtIndex:0]];

    CLLocationCoordinate2D coordinates[[self.locations count]];
    for(int i = 0; i < self.locations.count; i++)
    {
        CLLocation *currentLocation = [locations objectAtIndex:i];
        coordinates[i] = currentLocation.coordinate;
    }

    MKPolyline *pathPolyline = [MKPolyline polylineWithCoordinates:coordinates count:self.locations.count];
    [self.mapView addOverlay:pathPolyline];
}

- (MKOverlayRenderer *)mapView:(MKMapView *)mapView rendererForOverlay:(id<MKOverlay>)overlay
{
    if([overlay isKindOfClass:[MKPolyline class]])
    {
        MKPolylineRenderer *polylineRenderer = [[MKPolylineRenderer alloc] initWithPolyline:overlay];
        polylineRenderer.fillColor = [[UIColor redColor] colorWithAlphaComponent:0.2];
        polylineRenderer.strokeColor = [[UIColor redColor] colorWithAlphaComponent:0.7];
        polylineRenderer.lineWidth = 2.0;
        return polylineRenderer;
    }
    else
    {
        return  nil;
    }
}

现在,只有注释显示,没有任何MKPolyline显示。我究竟做错了什么 ?谢谢。

4

1 回答 1

2
  1. 正如评论中提到的,你的locations数组永远不会被分配和初始化,所以它nil和对它的调用(比如addObject)什么都不做,所以折线永远不会添加任何坐标(所以它不会显示)。

    viewDidLoad,开始之前CLLocationManager,分配和初始化数组:

    self.locations = [NSMutableArray array];
    
  2. 您将遇到的另一个问题是循环didUpdateLocations中的这一行:for

    CLLocation *currentLocation = [locations objectAtIndex:i];
    

    在这里,locations(没有self.)是指委托方法的本地参数变量,而不是您的locations 类实例级属性变量。编译器必须通过诸如“'locations' 的本地声明隐藏实例变量”之类的消息来警告您。

    在这种情况下,警告很关键。您在这里真正要做的是引用locations存储用户完整坐标轨迹的属性变量,而不是仅具有最后 x 个未报告位置(通常只有 1 个对象)的局部变量。

    因此该行应更改为:

    CLLocation *currentLocation = [self.locations objectAtIndex:i];
    

    locations如果您只是使用不同的名称而不是避免这些问题,那会更好。

  3. 正如评论中提到的那样,由于每次用户移动时您都添加了用户完整运动轨迹的叠加层,因此您需要先删除先前的叠加层。否则,您将不必要地向地图添加多个叠加层,因为最后一个叠加层覆盖了整个运动。之前的叠加层不明显可见,因为它们具有相同的坐标、相同的颜色和相同的线宽。所以在调用之前addOverlay,最简单的方法是调用removeOverlays地图当前的覆盖列表:

    //remove any previous overlays first...
    [self.mapView removeOverlays:mapView.overlays];
    
    //now add overlay with the updated trail...
    [self.mapView addOverlay:pathPolyline];
    
  4. 不影响显示的一个小问题是fillColor折线的设置没有效果。您只需要设置strokeColor代码正在执行的操作。您可以删除对 set 的调用fillColor

  5. 最后,您可能有兴趣查看Apple 的 Breadcrumb 示例应用程序。他们的版本使用自定义叠加层,可以动态更新,而无需在每次更改或添加时删除和添加叠加层。

于 2013-12-21T22:25:35.817 回答