タイトルにあるように、ボタンを押して、iOSデバイスのネイティブマップアプリを自分のアプリ内から開きたいと思います。現在、MKmapview
ファイルから取得したlat/longのシンプルなピンを表示するjson
を使用しています。
コードはこれです:
- (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];
} `
ピンをタッチすると、タイトルと情報ボタンが付いた情報ボックスが表示されます。
これはコードです:
#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;
}
上記の情報ボックスのボタンをクリックすると、現在のユーザーの場所から上記のmapPointへの道順でマップアプリを開くメソッドを作成したいと思います。それは可能ですか?また、このボタンの外観をカスタマイズできますか? (つまり、ボタンに別の画像を置いて、「ちょっと押してくれ」と思わせるようなものです)。
これはばかげた質問であれば申し訳ありませんが、これは私の初めてのiOSアプリであり、Obj-cは私にとってまったく新しい言語です。
事前にすべての返信をありがとう。
ボタンを初期化し、ボタンにアクションを追加します。
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]];
}
mapPointを使用して、目的の場所に移動します。
Swift3以降
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)
}
saddr
、daddr
はurlencodedロケーション名またはロケーション座標の文字列 (エンコードURLについて)ここを見てください) 。
directionsURL
の例:
// 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"
その他のオプションパラメータ(トランスポートタイプ、マップタイプなど)は、 here をご覧ください
このコードを使用して、方向を指定してマップを開くことができます:(id <MKAnnotation>クラスに「coordinate」という名前のCLLocationCoordinate2Dパブリックプロパティがあると仮定します)
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];
ボタンを変更することもできます。実際には、標準スタイルのボタンを使用しています:
[UIButton buttonWithType:UIButtonTypeDetailDisclosure];
しかし、画像またはラベルを使用してカスタムボタンを割り当てることができます。
[[UIButton alloc] initWithImage:[UIImage imageNamed:"directionIcon.png"]];
Apple map。でルートを表示するための作業コードです。現在の場所から目的地まで機能します。目的地の緯度と経度を渡すだけです。
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];
}
また、問題に気づいた場合、または別の方法を見つける必要がある場合は、ここで共有してください。