2014-02-01 5 views
2

Я довольно новичок в Objective-c.Нанесение маршрута пользователей, сделанных на карте с использованием MKPolyline

В моем приложении я пытаюсь отобразить пользователей на маршруте.

Вот то, что я до сих пор, что только получает пользователи текущее местоположение:

#import "StartCycleViewController.h" 
#import "CrumbPath.h" 


@interface StartCycleViewController() 

@property (nonatomic, strong) CLLocationManager *locationManager; 

@property (nonatomic, strong) IBOutlet MKMapView *map; 

@property (nonatomic, strong) UIView *containerView; 





@end 

@implementation StartCycleViewController 

@synthesize cycleLocation = _cycleLocation; 
@synthesize currentCycleLocation = _currentCycleLocation; 






- (id)initWithNibName:(NSString *)nibNameOrNil bundle:(NSBundle *)nibBundleOrNil 
{ 
    self = [super initWithNibName:nibNameOrNil bundle:nibBundleOrNil]; 
    if (self) { 
    // Custom initialization 
    } 
    return self; 
} 

- (void)viewDidLoad 
{ 
    [super viewDidLoad]; 
    [self startCycleLocation]; 

    _containerView = [[UIView alloc] initWithFrame:self.view.bounds]; 
    [self.view addSubview:self.containerView]; 

    [self.containerView addSubview:self.map]; 
    // Do any additional setup after loading the view. 
} 


- (void)dealloc 
{ 
    self.locationManager.delegate = nil; 
} 


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


#pragma mark - startCycleLocation 

- (void)startCycleLocation{ 

    if (!_cycleLocation){ 
     _cycleLocation = [[CLLocationManager alloc]init]; 
     _cycleLocation.desiredAccuracy = kCLLocationAccuracyBestForNavigation; 
     _cycleLocation.distanceFilter = 10; 
     _cycleLocation.delegate = self; 

    } 
    [_cycleLocation startUpdatingLocation]; 

} 

- (void)locationManager:(CLLocationManager *)manager didUpdateToLocation:(CLLocation  *)newLocation fromLocation:(CLLocation *)oldLocation { 

    NSLog(@"didUpdateToLocation: %@", newLocation); 
    CLLocation *currentLocation = newLocation; 

    if (currentLocation != nil) { 
    self.longitudeLabel.text = [NSString stringWithFormat:@"%.8f", currentLocation.coordinate.longitude]; 
    self.latitudeLabel.text = [NSString stringWithFormat:@"%.8f", currentLocation.coordinate.latitude]; 

    } 
} 



- (void) locationManager:(CLLocationManager *)manager didFailWithError:(NSError *)error { 
    NSLog(@"%@",error); 

    if ([error code] != kCLErrorLocationUnknown){ 
     [self stopLocationManager]; 
    } 
} 

- (void) stopLocationManager { 
    [self.cycleLocation stopUpdatingLocation]; 
} 



@end 

Я был осмотреться в Интернете и собрать, что я должен использовать MKPolyline и дать ему координаты. Но я просто не уверен, как я буду хранить местоположения, а затем отправлю им использование MKPolyline, чтобы нарисовать точки, непрерывно, пока приложение запущено.

ответ

3

Вы должны просто создать NSMutableArray, чтобы сохранить ваши местоположения, которые вы создаете в viewDidLoad. Итак, у нас есть didUpdateToLocation (или, если вы поддерживаете iOS 6 и выше, вы должны использовать didUpdateToLocations) просто добавьте местоположение в массив, а затем постройте MKPolyline из этого массива, добавьте, что MKPolyline на карту, а затем удалите старый MKPolyline. Или вы можете добавить все сегменты линии как отдельные объекты MKPolyline, но идея такая же, создайте модель для размещения ваших местоположений (например, NSMutableArray), а затем добавьте соответствующие объектык виду карты.

Например, вы могли бы сделать что-то вроде:

#pragma mark - CLLocationManagerDelegate 

- (void)locationManager:(CLLocationManager *)manager didUpdateLocations:(NSArray *)locations 
{ 
    CLLocation *location = [locations lastObject]; 

    if (location.horizontalAccuracy < 0) 
     return; 

    [self.locations addObject:location]; 
    NSUInteger count = [self.locations count]; 

    if (count > 1) { 
     CLLocationCoordinate2D coordinates[count]; 
     for (NSInteger i = 0; i < count; i++) { 
      coordinates[i] = [(CLLocation *)self.locations[i] coordinate]; 
     } 

     MKPolyline *oldPolyline = self.polyline; 
     self.polyline = [MKPolyline polylineWithCoordinates:coordinates count:count]; 
     [self.mapView addOverlay:self.polyline]; 
     if (oldPolyline) 
      [self.mapView removeOverlay:oldPolyline]; 
    } 
} 

И не забудьте указать, как карта привлечь MKPolyline. Таким образом, установить контроллер представления, чтобы быть delegate из ваших MKMapView, а затем вы можете сделать что-то вроде следующего:

#pragma mark - MKMapViewDelegate 

- (MKOverlayRenderer *)mapView:(MKMapView *)mapView rendererForOverlay:(id<MKOverlay>)overlay 
{ 
    if ([overlay isKindOfClass:[MKPolyline class]]) 
    { 
     MKPolylineRenderer *renderer = [[MKPolylineRenderer alloc] initWithPolyline:overlay]; 

     renderer.strokeColor = [[UIColor blueColor] colorWithAlphaComponent:0.7]; 
     renderer.lineWidth = 3; 

     return renderer; 
    } 

    return nil; 
} 

// for iOS versions prior to 7; see `rendererForOverlay` for iOS7 and later 

- (MKOverlayView *)mapView:(MKMapView *)mapView viewForOverlay:(id <MKOverlay>)overlay 
{ 
    if ([overlay isKindOfClass:[MKPolyline class]]) 
    { 
     MKPolylineView *overlayView = [[MKPolylineView alloc] initWithPolyline:overlay]; 

     overlayView.strokeColor  = [[UIColor blueColor] colorWithAlphaComponent:0.7]; 
     overlayView.lineWidth  = 3; 

     return overlayView; 
    } 

    return nil; 
} 
+0

Спасибо за ответ :) Извините, я все еще новичок во всем этом! Я внедрил код и получаю несколько ошибок, я уверен, что все это элементарно. Я попытался установить контроллер представления делегатом MKMapView с помощью [mapView setDelegate: self]; это правильно? – Khledon

+0

Также я получаю следующие ошибки: @ self.location addObject «no visible @interface для NSArray объявляет sddObject» и @ self.mapview «не найден на объекте типа». Опять я уверен, что что-то очевидное я сделал неправильно! – Khledon

+0

@ user3254994 Да, чтобы указать делегат для 'MKMapView', вы можете сделать это в коде, подобном этому (или вы можете сделать это в IB, перейдя в« Inspectors Connections »). Ошибка в отношении 'self.locations' заключается в том, что вы определили и/или создали его как« NSArray », а не как« NSMutableArray ». Используйте последний. – Rob

0

ваше требование нужно подробное объяснение, вот почему я предлагаю вам ссылку, которая поможет ему много для такого рода проблем. draw line on map

Если вам нужно что-нибудь сказать мне.

 Смежные вопросы

  • Нет связанных вопросов^_^