web-dev-qa-db-fra.com

Ouvre l'application Apple maps de l'application ios avec les directions

Comme le titre l'indique, j'aimerais ouvrir l'application de cartes natives dans l'appareil ios à partir de ma propre application, en appuyant sur un bouton. actuellement, j'ai utilisé un MKmapview qui affiche une simple broche avec lat/long tirée d'un fichier json.

le code est le suivant:

- (void)viewDidLoad {
    [super viewDidLoad]; 
}


// We are delegate for map view
self.mapView.delegate = self;

// Set title
self.title = self.location.title;

// set texts...
self.placeLabel.text = self.location.place;


self.telephoneLabel.text = self.location.telephone;
self.urlLabel.text = self.location.url;


**// Make a map annotation for a pin from the longitude/latitude points
MapAnnotation *mapPoint = [[MapAnnotation alloc] init];
mapPoint.coordinate = CLLocationCoordinate2DMake([self.location.latitude doubleValue], [self.location.longitude doubleValue]);
mapPoint.title = self.location.title;**

// Add it to the map view
[self.mapView addAnnotation:mapPoint];

// Zoom to a region around the pin
MKCoordinateRegion region = MKCoordinateRegionMakeWithDistance(mapPoint.coordinate, 500, 500);
[self.mapView setRegion:region];

} `

Lorsque vous touchez l'épingle, une boîte d'informations apparaît avec un titre et un bouton d'informations.

c'est le code:

    #pragma mark - MKMapViewDelegate

- (MKAnnotationView *)mapView:(MKMapView *)mapView viewForAnnotation:(id<MKAnnotation>)annotation {
    MKPinAnnotationView *view = nil;
    static NSString *reuseIdentifier = @"MapAnnotation";

    // Return a MKPinAnnotationView with a simple accessory button
    view = (MKPinAnnotationView *)[mapView dequeueReusableAnnotationViewWithIdentifier:reuseIdentifier];
    if(!view) {
        view = [[MKPinAnnotationView alloc] initWithAnnotation:annotation reuseIdentifier:reuseIdentifier];
        view.rightCalloutAccessoryView = [UIButton buttonWithType:UIButtonTypeDetailDisclosure];
        view.canShowCallout = YES;
        view.animatesDrop = YES;
    }

    return view;
}

Je veux créer une méthode qui ouvre l'application Maps avec des directions de l'emplacement des utilisateurs actuels au mapPoint ci-dessus, en cliquant sur le bouton dans la boîte d'informations ci-dessus. Est-ce possible? Puis-je également personnaliser l'apparence de ce bouton? (je veux dire comme mettre une image différente sur le bouton pour le faire ressembler à "appuyez sur moi pour la direction un peu").

Désolé si c'est une question stupide, mais c'est ma première application ios et Obj-c est une langue totalement nouvelle pour moi.

merci pour toutes les réponses à l'avance.

19
Kostenko

Vous lancez un bouton et ajoutez une action au bouton:

Code Objective-C

NSString* directionsURL = [NSString stringWithFormat:@"http://maps.Apple.com/?saddr=%f,%f&daddr=%f,%f",self.mapView.userLocation.coordinate.latitude, self.mapView.userLocation.coordinate.longitude, mapPoint.coordinate.latitude, mapPoint.coordinate.longitude];
if ([[UIApplication sharedApplication] respondsToSelector:@selector(openURL:options:completionHandler:)]) {
    [[UIApplication sharedApplication] openURL:[NSURL URLWithString: directionsURL] options:@{} completionHandler:^(BOOL success) {}];
} else {
    [[UIApplication sharedApplication] openURL:[NSURL URLWithString: directionsURL]];
}

avec le mapPoint est l'endroit où vous souhaitez vous diriger.

Swift3 ou version ultérieure

let directionsURL = "http://maps.Apple.com/?saddr=35.6813023,139.7640529&daddr=35.4657901,139.6201192"
guard let url = URL(string: directionsURL) else {
    return
}
if #available(iOS 10.0, *) {
    UIApplication.shared.open(url, options: [:], completionHandler: nil)
} else {
    UIApplication.shared.openURL(url)
}

Notez que saddr, daddr est chaîne codée en url du nom de l'emplacement ou des coordonnées de l'emplacement (à propos de l'URL de codage regardez ici) .

directionsURL exemple:

// directions with location coordinate
"http://maps.Apple.com/?saddr=35.6813023,139.7640529&daddr=35.4657901,139.6201192"
// or directions with location name
"http://maps.Apple.com/?saddr=Tokyo&daddr=Yokohama"
// or directions from current location to destination location
"http://maps.Apple.com/?saddr=Current%20Location&daddr=Yokohama"

Plus de paramètres d'options (comme le type de transport, le type de carte ...) regardez ici

42
larva

Vous pouvez ouvrir des cartes avec direction en utilisant ce code: (en supposant que votre classe id <MKAnnotation> possède une propriété publique CLLocationCoordinate2D nommée "coordonnée")

MKPlacemark *placemark = [[MKPlacemark alloc] initWithCoordinate:[annotation coordinate] addressDictionary:nil];
MKMapItem *mapItem = [[MKMapItem alloc] initWithPlacemark:placemark];
[mapItem setName:"WhereIWantToGo"]];
NSDictionary *options = @{MKLaunchOptionsDirectionsModeKey : MKLaunchOptionsDirectionsModeDriving};
[mapItem openInMapsWithLaunchOptions:options];

Vous pouvez également modifier le bouton, en fait vous utilisez un bouton de style standard:

[UIButton buttonWithType:UIButtonTypeDetailDisclosure];

Mais vous pouvez attribuer à votre bouton personnalisé une image ou une étiquette:

[[UIButton alloc] initWithImage:[UIImage imageNamed:"directionIcon.png"]];
16
Michaël Azevedo

Voici le code de travail pour afficher les directions sur la carte Apple. Cela fonctionnera pour le lieu actuel jusqu'à votre lieu de destination et il vous suffit de passer lat et long du lieu de destination.

double destinationLatitude, destinationLongitude;
destinationLatitude=// Latitude of destination place.
destinationLongitude=// Longitude of destination place.

Class mapItemClass = [MKMapItem class];

if (mapItemClass && [mapItemClass respondsToSelector:@selector(openMapsWithItems:launchOptions:)])
{
    // Create an MKMapItem to pass to the Maps app
    CLLocationCoordinate2D coordinate = CLLocationCoordinate2DMake(destinationLatitude,destinationLongitude);
    MKPlacemark *placemark = [[MKPlacemark alloc] initWithCoordinate:coordinate addressDictionary:nil];

    MKMapItem *mapItem = [[MKMapItem alloc] initWithPlacemark:placemark];
    [mapItem setName:@"Name/text on destination annotation pin"];

    // Set the directions mode to "Driving"
    // Can use MKLaunchOptionsDirectionsModeDriving instead
    NSDictionary *launchOptions = @{MKLaunchOptionsDirectionsModeKey : MKLaunchOptionsDirectionsModeDriving};

    // Get the "Current User Location" MKMapItem
    MKMapItem *currentLocationMapItem = [MKMapItem mapItemForCurrentLocation];

    // Pass the current location and destination map items to the Maps app
    // Set the direction mode in the launchOptions dictionary
    [MKMapItem openMapsWithItems:@[currentLocationMapItem, mapItem] launchOptions:launchOptions];
}

Aussi, partagez-moi ici, si vous remarquez un problème ou si nous devons trouver une autre façon de le faire.

9
anshul-systematix