(八十一)システムに付属のAppを利用してナビゲーションを実現する


システムの地図アプリを利用してナビゲートし、始点と終点、起動パラメータを入力し、MKMapItemのクラスメソッドopenMapWithItems:launchOptions:を呼び出して位置決めを実現するだけで、このメソッドを呼び出すとシステムの地図アプリが開きます.
次に、この方法を見てみましょう.
+ (BOOL)openMapsWithItems:(NSArray *)mapItems launchOptions:(NSDictionary *)launchOptions;

①最初のパラメータは1つのMapItem配列であり、各MapItemには1つのランドマークを含み、2つのMapItem、1つを起点とし、1つを終点とすることができる.
MKPlacemarkを利用して初期化することができ、MKPlacemarkはCLPlacemarkを利用して初期化することができ、CLPlacemarkを得るにはCLGeocoderオブジェクトを利用して地名を地理的に符号化して得ることができる.
②2番目のパラメータは辞書で、辞書のキーと値はマニュアルで調べることができ、値は以前に地図の属性を設定したときの値を使用することができ、オブジェクト以外の包装が必要であることに注意します.
次のコードは,2つのTextFieldによって始点と終点の地名を入力し,位置決め開始ボタンをクリックすることで,システムに付属する地図Appを開いて位置決めを実現することを示す.
注意blockはコールバックメソッドであり、開始点の終点のランドマークを順番に取得するために、最初のblockに2番目のblockコードを書く.
#import "ViewController.h"
#import <MapKit/MapKit.h>

@interface ViewController ()
@property (weak, nonatomic) IBOutlet UITextField *startView;
@property (weak, nonatomic) IBOutlet UITextField *endView;
@property (strong, nonatomic) CLGeocoder *gcoder;
@property (strong, nonatomic) CLPlacemark *startMrk,*endMrk;

@end

@implementation ViewController

- (void)viewDidLoad {
    [super viewDidLoad];
    
    _gcoder = [[CLGeocoder alloc] init];

}


- (IBAction)startGeo:(id)sender {
    
    NSString *startStr = _startView.text;
    NSString *endStr = _endView.text;
    
    [_gcoder geocodeAddressString:startStr completionHandler:^(NSArray *placemarks, NSError *error) {
        if (!placemarks.count) return;
        _startMrk = [placemarks firstObject];
        [_gcoder geocodeAddressString:endStr completionHandler:^(NSArray *placemarks, NSError *error) {
            if (!placemarks.count) return;
            _endMrk = [placemarks firstObject];
            [self startNavigation];
        }];
    }];
    
}

- (void)startNavigation{
    
    MKPlacemark *startMrk = [[MKPlacemark alloc] initWithPlacemark:_startMrk];
    MKPlacemark *endMrk = [[MKPlacemark alloc] initWithPlacemark:_endMrk];
    MKMapItem *startItem = [[MKMapItem alloc] initWithPlacemark:startMrk];
    MKMapItem *endItem = [[MKMapItem alloc] initWithPlacemark:endMrk];
    NSArray *items = @[startItem,endItem];
    
    NSMutableDictionary *options = [NSMutableDictionary dictionary];
    /*
          key
        NSString * const MKLaunchOptionsDirectionsModeKey;
        NSString * const MKLaunchOptionsMapTypeKey;
        NSString * const MKLaunchOptionsMapCenterKey;
        NSString * const MKLaunchOptionsMapSpanKey;
        NSString * const MKLaunchOptionsShowsTrafficKey;
        NSString * const MKLaunchOptionsCameraKey
                ,         @  
    */
    options[MKLaunchOptionsDirectionsModeKey] = MKLaunchOptionsDirectionsModeDriving;
    options[MKLaunchOptionsMapTypeKey] = @(MKMapTypeStandard);
    [MKMapItem openMapsWithItems:items launchOptions:options];
    
}

@end