2016-02-29 70 views
-1

我已經創建了一個mapView(對不起,我把我的outlet命名爲mapKit而不是mapView)。我獲取了我的當前位置,並且我已經手動將註釋引腳設置爲某個位置。現在我需要的是,只要我點擊註釋引腳(請正好在註釋引腳上,而不是calloutAccessoryButton),我需要找到一個路徑,可能使用從當前位置到註釋引腳的多路徑。不完全像一個方向,只是一個路徑,聚覆蓋。請查看我的代碼並幫助我。如何從我的當前位置繪製一條路徑到我在mapView中設置的註釋針?

- (void)viewDidLoad { 
    [super viewDidLoad]; 

    locationManager = [[CLLocationManager alloc] init]; 
    [locationManager requestWhenInUseAuthorization]; 
    locationManager.desiredAccuracy = kCLLocationAccuracyBest; 
    locationManager.delegate = self; 

    [locationManager startUpdatingLocation]; 

    MKPointAnnotation *myAnnotation = [[MKPointAnnotation alloc]init]; 

    CLLocationCoordinate2D pinCoordinate; 
    pinCoordinate.latitude = 51.49795; 
    pinCoordinate.longitude = -0.174056; 
    myAnnotation.coordinate = pinCoordinate; 
    myAnnotation.title = @"Matthews Pizza"; 
    myAnnotation.subtitle = @"Best Pizza in Town"; 
    [self.mapKit addAnnotation:myAnnotation]; 

// myAnnotation.coordinate = CLLocationCoordinate2DMake(51.49795, -0.174056); 

    // Do any additional setup after loading the view. 
} 
-(void)checkStatus{ 

    CLAuthorizationStatus status = [CLLocationManager authorizationStatus]; 

    if (status==kCLAuthorizationStatusNotDetermined) { 
     NSLog(@"Not Determined"); 
    } 

    if (status==kCLAuthorizationStatusDenied) { 
     NSLog(@"Denied"); 

    } 

    if (status==kCLAuthorizationStatusRestricted) { 
     NSLog(@"Restricted"); 

    } 

    if (status==kCLAuthorizationStatusAuthorizedAlways) { 
     NSLog(@"Always Allowed"); 

    } 

    if (status==kCLAuthorizationStatusAuthorizedWhenInUse) { 
     NSLog(@"NWhen In Use Allowed"); 

    } 

} 

- (void)didReceiveMemoryWarning { 
    [super didReceiveMemoryWarning]; 
    // Dispose of any resources that can be recreated. 
} 
-(void)viewWillAppear:(BOOL)animated{ 
} 
- (void)mapView:(MKMapView *)mapView didUpdateUserLocation:(MKUserLocation *)userLocation 
{ 

    MKCoordinateRegion region = MKCoordinateRegionMakeWithDistance(userLocation.coordinate, 800, 800); 
    [self.mapKit setRegion:[self.mapKit regionThatFits:region] animated:YES]; 




} 


#pragma mark - CLLocationManagerDelegate 

- (void)locationManager:(CLLocationManager *)manager didFailWithError:(NSError *)error 
{ 
    NSLog(@"didFailWithError: %@", error); 
    UIAlertView *errorAlert = [[UIAlertView alloc] 
           initWithTitle:@"Error" message:@"Failed to Get Your Location" delegate:nil cancelButtonTitle:@"OK" otherButtonTitles:nil]; 
    [errorAlert show]; 
} 

- (void)locationManager:(CLLocationManager *)manager didUpdateToLocation:(CLLocation *)newLocation fromLocation:(CLLocation *)oldLocation 
{ 
    NSLog(@"didUpdateToLocation: %@", newLocation); 
    CLLocation *currentLocation = newLocation; 

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

    } 
} 



- (MKAnnotationView *)mapView:(MKMapView *)mapView viewForAnnotation:(id <MKAnnotation>)annotation 
{ 
    // If it's the user location, just return nil. 
    if ([annotation isKindOfClass:[MKUserLocation class]]) 
     return nil; 

    // Handle any custom annotations. 
    if ([annotation isKindOfClass:[MKPointAnnotation class]]) 
    { 
     // Try to dequeue an existing pin view first. 
     MKAnnotationView *pinView = (MKAnnotationView*)[mapView dequeueReusableAnnotationViewWithIdentifier:@"CustomPinAnnotationView"]; 
     if (!pinView) 
     { 
      // If an existing pin view was not available, create one. 
      pinView = [[MKAnnotationView alloc] initWithAnnotation:annotation reuseIdentifier:@"CustomPinAnnotationView"]; 

      pinView.canShowCallout = YES; 
      pinView.image = [UIImage imageNamed:@"ic_map"]; 
      pinView.calloutOffset = CGPointMake(0, 32); 
      UIButton* rightButton = [UIButton buttonWithType:UIButtonTypeDetailDisclosure]; 
      pinView.rightCalloutAccessoryView = rightButton; 
     } else { 
      pinView.annotation = annotation; 
     } 
     return pinView; 
    } 
    return nil; 
} 


-(void)mapView:(MKMapView *)mapView annotationView:(MKAnnotationView *)view calloutAccessoryControlTapped:(UIControl *)control { 
    id <MKAnnotation> annotation = [view annotation]; 
    if ([annotation isKindOfClass:[MKPointAnnotation class]]) 
    { 
     NSLog(@"Clicked Pizza Shop"); 
    } 
    UIAlertView *alertView = [[UIAlertView alloc] initWithTitle:@"Disclosure Pressed" message:@"Click Cancel to Go Back" delegate:self cancelButtonTitle:@"Cancel" otherButtonTitles:@"OK", nil]; 
    [alertView show]; 
} 
+0

嘗試這個 - http://www.techotopia.com/index.php/Using_MKDirections_to_get_iOS_7_Map_Directions_and_Routes – Signare

+0

但事情是它啓動另一個地圖上,我有選擇的目的地源,然後按下路線找到路線。我需要的是,只要我按我的註釋針,我需要它自動找到路線。 –

回答

0

當點擊註釋銷委派方法將調用

-(void)mapView:(MKMapView *)mapView didSelectAnnotationView:(MKAnnotationView *)view 
{ 
    NSLog(@"Latitude: %f", view.annotation.coordinate.latitude); 
    NSLog(@"Longitude: %f", view.annotation.coordinate.longitude); 
    self.annotationViewCoordinate = view.annotation.coordinate; 
    [self GetDirections:view.annotation.coordinate]; 
} 

來畫出路徑

- (void)GetDirections:(CLLocationCoordinate2D)locationCoordinate 
{ 
    MKPlacemark *aPlcSource = [[MKPlacemark alloc] initWithCoordinate:self.mapView.userLocation.coordinate addressDictionary:[NSDictionary dictionaryWithObjectsAndKeys:@"",@"", nil]]; 

    MKPlacemark *aPlcDest = [[MKPlacemark alloc] initWithCoordinate:locationCoordinate addressDictionary:[NSDictionary dictionaryWithObjectsAndKeys:@"",@"", nil]]; 

    MKMapItem *mpItemSource = [[MKMapItem alloc] initWithPlacemark:aPlcSource]; 
    [mpItemSource setName:@"Source"]; 

    MKMapItem *mpItemDest = [[MKMapItem alloc] initWithPlacemark:aPlcDest]; 
    [mpItemDest setName:@"Dest"]; 

    MKDirectionsRequest *aDirectReq = [[MKDirectionsRequest alloc] init]; 
    [aDirectReq setSource:mpItemSource]; 
    [aDirectReq setDestination:mpItemDest]; 
    [aDirectReq setTransportType:MKDirectionsTransportTypeAutomobile]; 

    MKDirections *aDirections = [[MKDirections alloc] initWithRequest:aDirectReq]; 
    [aDirections calculateDirectionsWithCompletionHandler:^(MKDirectionsResponse *response, NSError *error) { 
     if (error) { 
      NSLog(@"Error :: %@",error); 
     } 
     else{ 

      NSArray *aArrRoutes = [response routes]; 
      NSLog(@"Routes :: %@",aArrRoutes); 

      [self.mapView removeOverlays:self.mapView.overlays]; 

      [aArrRoutes enumerateObjectsUsingBlock:^(id obj, NSUInteger idx, BOOL *stop) { 
       MKRoute *aRoute = obj; 

       [self.mapView addOverlay:aRoute.polyline]; 

       NSLog(@"Route Name : %@",aRoute.name); 
       NSLog(@"Total Distance (in Meters) :%f",aRoute.distance); 
NSArray *aArrSteps = [aRoute steps]; 

       NSLog(@"Total Steps : %lu",(unsigned long)[aArrSteps count]); 

       [aArrSteps enumerateObjectsUsingBlock:^(id obj, NSUInteger idx, BOOL *stop) { 
        NSLog(@"Rout Instruction : %@",[obj instructions]); 
        NSLog(@"Rout Distance : %f",[obj distance]); 
       }]; 

      }]; 
     } 
}]; 
} 

當用戶位置移動 U可以調用方法

- (void)GetDirections:(CLLocationCoordinate2D)locationCoordinate 

從方法

- (void)mapView:(MKMapView *)mapView didUpdateUserLocation:(MKUserLocation *)userLocation 
{ 
    [self GetDirections:self.annotationViewCoordinate]; 
} 
+0

我有一個註釋點,因爲你已經看到它了。當我點擊註釋針時,我如何讓我繪製路線[不使用右側或左側標註附件按鈕]。 –

+0

即你想在你點擊註釋Pin Right時畫出路徑? –

+0

代碼更新。檢查它 –

相關問題