-1

I have created a mapView(sorry i named my outlet as mapKit instead of mapView). I fetched my current location and i have manually set an annotation pin to a location. Now what i need is as soon as i click on the annotation pin(Please exactly on the annotation pin, not a calloutAccessoryButton)i need to find a path maybe using polyPath from my current location to the annotation pin. Not exactly like a direction, just a path, poly overlay. Please look into my code and help me out.

- (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];
}
kb920
  • 3,039
  • 2
  • 33
  • 44
Thejus
  • 169
  • 12
  • 1
    try this- http://www.techotopia.com/index.php/Using_MKDirections_to_get_iOS_7_Map_Directions_and_Routes – Rince Thomas Feb 29 '16 at 10:24
  • but the thing is it launches another map on which i have to select the destination source and then press on route to find the route. what i need is as soon as i press on my annotation pin , i need it to find the route automatically. – Thejus Feb 29 '16 at 11:42

1 Answers1

1

when click on Annotation pin Delegate Method Will Call

-(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];
} 

For Draw Path

 - (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]);
                }];

            }];
        }
}];
}

When User Location moving u can call Method

- (void)GetDirections:(CLLocationCoordinate2D)locationCoordinate

from method

 - (void)mapView:(MKMapView *)mapView didUpdateUserLocation:(MKUserLocation *)userLocation
{
     [self GetDirections:self.annotationViewCoordinate];
}
  • I have a annotation point as you would have seen it already. how do i make i draw the route as soon as i click on the annotation pin.[without using right or left callout accessory button]. – Thejus Feb 29 '16 at 11:45
  • i.e. u want to draw path when u click on annotation Pin Right? – Bhargav B. Bajani Feb 29 '16 at 11:54
  • Code Update . Check It – Bhargav B. Bajani Feb 29 '16 at 12:02
  • How silly of me, it never crossed my mind that annotations have a didSelectAnnotation delegate. That did it. Thanks a lot. – Thejus Feb 29 '16 at 12:07
  • 1
    u welcome And Code Edited For When current location Update – Bhargav B. Bajani Feb 29 '16 at 12:12
  • I'm having a memory issue now [link](http://stackoverflow.com/questions/35700726/how-to-fix-the-excess-memory-being-used-in-mapkit-ios). Please look into this. Tried implementing the fixes available on stack(HotFix),didn't help much. – Thejus Feb 29 '16 at 13:26