is there a way to get directions in mkmapview using a built in apple API?

后端 未结 4 1509
爱一瞬间的悲伤
爱一瞬间的悲伤 2020-12-01 05:50

I know google maps are known to be the best maps out there, but i dont want to have to download a bunch of extra libraries and all that. I\'d prefer to do something quick an

相关标签:
4条回答
  • 2020-12-01 06:02

    if you want show a Alert Dialog when you tapped in a Pin make this:

    - (void)mapView:(MKMapView *)mapView annotationView:(MKAnnotationView *)view     calloutAccessoryControlTapped:(UIControl *)control {
    [mapView deselectAnnotation:view.annotation animated:YES];
    
        if ([view.annotation isKindOfClass:[PinOfProject class]])
        {
            CLLocationCoordinate2D coordinate = [view.annotation coordinate];
            MKPlacemark *placemark = [[MKPlacemark alloc] initWithCoordinate:coordinate addressDictionary:nil];
            MKMapItem *mapitem = [[MKMapItem alloc] initWithPlacemark:placemark];
            self.mapItem = mapitem;
    
            CGPoint pin = [mapView convertCoordinate:view.annotation.coordinate toPointToView:self.view];
            CGRect rec = CGRectMake(pin.x-13, pin.y-14,view.frame.size.width,view.frame.size.height);
    
    
            [self showAlertInformationForTrash:rec];
    
        }
    }
    
    -(void)showAlertInformationForTrash:(CGRect)rec{
    
        UIActionSheet *actionSheet = [[UIActionSheet alloc] initWithTitle:@"Show Route?" delegate:self cancelButtonTitle:nil destructiveButtonTitle:nil otherButtonTitles:@"Route", @"Cancel", nil];
        actionSheet.tag = 1;
        [actionSheet showFromRect:rec inView:self.view animated:YES];
    }
    
    - (void)actionSheet:(UIActionSheet *)actionSheet clickedButtonAtIndex:(NSInteger)buttonIndex {
        if (buttonIndex == 0) {
            [self showRouteToAnnotation];
        }
    }
    
    -(void)showRouteToAnnotation{
        MKMapItem *myMapItem = self.mapItem;
        MKDirectionsRequest *request = [[MKDirectionsRequest alloc] init];
        [request setSource:[MKMapItem mapItemForCurrentLocation]];
        [request setDestination:myMapItem];
        [request setTransportType:MKDirectionsTransportTypeAutomobile]; // This can be limited to automobile and walking directions.
        [request setRequestsAlternateRoutes:NO]; // Gives you several route options.
        MKDirections *directions = [[MKDirections alloc] initWithRequest:request];
        [directions calculateDirectionsWithCompletionHandler:^(MKDirectionsResponse *response, NSError *error) {
            if (!error) {
                for (MKRoute *route in [response routes]) {
                    [self.mapView addOverlay:[route polyline] level:MKOverlayLevelAboveRoads]; // Draws the route above roads, but below labels.
                    for (int i = 0; i < route.steps.count; i++) {
                        MKRouteStep *step = [route.steps objectAtIndex:i];
                        NSString *newStep = step.instructions;
                        NSLog(@"%@", newStep);
                    }                                                                       
                }
            }
        }];
    }
    
    - (MKOverlayRenderer *)mapView:(MKMapView *)mapView rendererForOverlay:(id<MKOverlay>)overlay
    {
        if ([overlay isKindOfClass:[MKPolyline class]]) {
            MKPolylineRenderer *renderer = [[MKPolylineRenderer alloc] initWithOverlay:overlay];
            [renderer setStrokeColor:[UIColor blueColor]];
            [renderer setLineWidth:5.0];
            return renderer;
        }
        return nil;
    }
    
    • Oh, but note that i make a property in my .h @property (strong, nonatomic)MKMapItem *mapItem;
    0 讨论(0)
  • 2020-12-01 06:03

    Another possibility is to send the address to the Apple Maps app. I just saw this done in a professional setting and that was the chosen method.

    0 讨论(0)
  • 2020-12-01 06:08

    In iOS 7, you can get and display directions using MKDirectionsRequest.

    Here's some sample code for displaying directions from the current location to another map item:

    MKDirectionsRequest *request = [[MKDirectionsRequest alloc] init];
    [request setSource:[MKMapItem mapItemForCurrentLocation]];
    [request setDestination:myMapItem];
    [request setTransportType:MKDirectionsTransportTypeAny]; // This can be limited to automobile and walking directions.
    [request setRequestsAlternateRoutes:YES]; // Gives you several route options.
    MKDirections *directions = [[MKDirections alloc] initWithRequest:request];
    [directions calculateDirectionsWithCompletionHandler:^(MKDirectionsResponse *response, NSError *error) {
        if (!error) {
            for (MKRoute *route in [response routes]) {
                [myMapView addOverlay:[route polyline] level:MKOverlayLevelAboveRoads]; // Draws the route above roads, but below labels.
                // You can also get turn-by-turn steps, distance, advisory notices, ETA, etc by accessing various route properties.
            }
        }
    }];
    

    If you're new to iOS 7, you'll need to implement the mapView:rendererForOverlay: method for any overlay to appear. Something like:

    - (MKOverlayRenderer *)mapView:(MKMapView *)mapView rendererForOverlay:(id<MKOverlay>)overlay
    {
        if ([overlay isKindOfClass:[MKPolyline class]]) {
            MKPolylineRenderer *renderer = [[MKPolylineRenderer alloc] initWithOverlay:overlay];
            [renderer setStrokeColor:[UIColor blueColor]];
            [renderer setLineWidth:5.0];
            return renderer;
        }
        return nil;
    }
    
    0 讨论(0)
  • 2020-12-01 06:10

    Swift version

            let request = MKDirectionsRequest();
            request.source = MKMapItem.mapItemForCurrentLocation();
            let locationPlacemark = MKPlacemark(coordinate: CLLocationCoordinate2DMake(13.724362, 100.515342), addressDictionary: nil);
            request.destination = MKMapItem(placemark: locationPlacemark);
            request.transportType = MKDirectionsTransportType.Any;
            request.requestsAlternateRoutes = true;
            let directions = MKDirections(request: request);
    
            directions.calculateDirectionsWithCompletionHandler ({
                (response: MKDirectionsResponse?, error: NSError?) in
                print(response?.description)
                print(error?.description)
                guard let response = response else {
                    //handle the error here
                    return;
                }
                self.myRoute = response.routes[0]
                self.mkMapView.addOverlay(self.myRoute!.polyline)
            });
    

    and its delegate

            func mapView(mapView: MKMapView, rendererForOverlay overlay: MKOverlay) -> MKOverlayRenderer {
            let myLineRenderer = MKPolylineRenderer(polyline: (self.myRoute?.polyline)!)
            myLineRenderer.strokeColor = UIColor.redColor()
            myLineRenderer.lineWidth = 3
            return myLineRenderer
            }
    
    0 讨论(0)
提交回复
热议问题