initWithPlacemark: destination];
В классе MKDirectionsRequest есть свойство transportType, относящееся к типу MKDirectionsTransportType:
typedef NS_OPTIONS(NSUInteger, MKDirectionsTransportType) {
MKDirectionsTransportTypeAutomobile = 1 << 0,
MKDirectionsTransportTypeWalking = 1 << 1,
MKDirectionsTransportTypeAny = 0x0FFFFFFF
} NS_ENUM_AVAILABLE(10_9, 7_0);
Поскольку мы хотим отобразить направления проезда из исходной точки в точку назначения, в этом разделе воспользуемся значением MKDirectionsTransportTypeAutomobile:
/* Мы собираемся попасть в точку назначения на автомобиле */
request.transportType = MKDirectionsTransportTypeAutomobile;
Наконец, создаем экземпляр класса MKDirections с помощью метода-инициализатора initWithRequest:. В качестве параметра инициализатор принимает экземпляр класса MKDirectionsRequest. Мы уже создали и подготовили этот объект с элементом карты, указывающим точку отправления и точку назначения.
Затем применим в нашем классе, описывающем направления, метод экземпляра calculateDirectionsWithCompletionHandler:. Этот метод позволяет получить направления от исходной точки к точке назначения. В качестве параметра этот метод принимает блоковый объект, предоставляющий нам объект типа MKDirectionsResponse и ошибку типа NSError (эта сущность позволяет определить, не произошла ли ошибка). У объекта отклика, который будет нам передан, есть два очень важных свойства: source и destination. Они будут соответствовать тем элементам карты (начальной и конечной точкам), которые мы задали ранее. Будучи в этом блоке, можно либо просто взять отклик с точкой назначения и обработать его вручную (как уже объяснялось), либо передать информацию о начальной и конечной точках в приложение Maps (Карты) для отображения, вот так:
/* Получаем направления */
MKDirections *directions = [[MKDirections alloc]
initWithRequest: request];
[directions calculateDirectionsWithCompletionHandler:
^(MKDirectionsResponse *response, NSError *error) {
/* Можно вручную выполнить синтаксический разбор отклика, но здесь мы
поступим иначе и воспользуемся приложением Maps (Карты) для отображения
начальной и конечной точек. Делать такой вызов API не обязательно, так как
ранее мы уже подготовили элементы карты. Но здесь вызов делается
в демонстрационных целях. Мы показываем, что в отклике с направлениями
содержится не только информация о начальной и конечной точках */
/* Отображаем направления в приложении Maps */
[MKMapItem
openMapsWithItems:@[response.source, response.destination]
launchOptions:@{
MKLaunchOptionsDirectionsModeKey:
MKLaunchOptionsDirectionsModeDriving}];
}];
Теперь, если объединить весь написанный код, он получится довольно компактным:
#import «AppDelegate.h»
#import
#import
@implementation AppDelegate
— (BOOL) application:(UIApplication *)application
didFinishLaunchingWithOptions:(NSDictionary *)launchOptions{
NSString *destination = <# Place your destination address here #>;
[[CLGeocoder new]
geocodeAddressString: destination
completionHandler: ^(NSArray *placemarks, NSError *error) {
if (error!= nil){
/* Здесь обрабатываем ошибку, например отобразив окно
с предупреждением */
return;
}