Чтение онлайн

на главную - закладки

Жанры

iOS. Приемы программирования

Нахавандипур Вандад

Шрифт:

#import <MapKit/MapKit.h>

@implementation AppDelegate

<# Оставшаяся часть вашего кода находится здесь #>

Далее воспользуемся информацией, изученной в разделе 9.7, и преобразуем адрес в данные широты и долготы:

— (BOOL) application:(UIApplication *)application

didFinishLaunchingWithOptions:(NSDictionary *)launchOptions{

NSString *destination = @"Churchill Square Shopping Center, \

Brighton, United Kingdom";

[[CLGeocoder new]

geocodeAddressString: destination

completionHandler: ^(NSArray *placemarks, NSError *error) {

<# Теперь у нас есть координаты адреса #>

}];

self.window = [[UIWindow alloc] initWithFrame: [[UIScreen mainScreen] bounds]];

// Точка переопределения для дополнительной настройки после запуска приложения.

self.window.backgroundColor = [UIColor whiteColor];

[self.window makeKeyAndVisible];

return YES;

}

Весь код, приведенный далее в этом разделе, будет находиться в объекте блока завершения, относящемся к методу geocodeAddressString: completionHandler: только что написанного нами класса CLGeocoder.

Блок завершения будет давать ссылку на объект ошибки. Вам потребуется считать этот объект ошибки и, если ошибка вернется, обработать ее соответствующим образом. Итак, давайте сообщим MapKit, что в качестве точки отсчета всех направлений должен использоваться тот пункт, в котором мы сейчас находимся. Для создания запроса направлений мы воспользуемся классом MKDirectionsRequest, а в качестве значения свойства source этого запроса зададим значение метода класса mapItemForCurrentLocation (этот метод относится к классу MKMapItem):

if (error!= nil){

/* Здесь обрабатываем ошибку, например отобразив окно с предупреждением */

return;

}

MKDirectionsRequest *request = [[MKDirectionsRequest alloc] init];

request.source = [MKMapItem mapItemForCurrentLocation];

Ранее мы создали строковый объект, в котором содержался наш адрес назначения. Теперь у нас есть экземпляр CLPlacemark и нужно преобразовать его в экземпляр MKPlacemark, который можно будет задать в запросе направления как значение свойства Destination:

/* Преобразуем метку назначения CoreLocation в метку MapKit */

/* Получаем метку адреса назначения */

CLPlacemark *placemark = placemarks[0];

CLLocationCoordinate2D destinationCoordinates =

placemark.location.coordinate;

MKPlacemark *destination = [[MKPlacemark alloc]

initWithCoordinate: destinationCoordinates

addressDictionary: nil];

request.destination = [[MKMapItem alloc]

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]

Поделиться:
Популярные книги

Кодекс Охотника. Книга XXIV

Винокуров Юрий
24. Кодекс Охотника
Фантастика:
фэнтези
попаданцы
аниме
5.00
рейтинг книги
Кодекс Охотника. Книга XXIV

Первый среди равных. Книга III

Бор Жорж
3. Первый среди Равных
Фантастика:
попаданцы
аниме
фэнтези
6.00
рейтинг книги
Первый среди равных. Книга III

Солдат Империи

Земляной Андрей Борисович
1. Страж
Фантастика:
попаданцы
альтернативная история
6.67
рейтинг книги
Солдат Империи

Двойник короля 17

Скабер Артемий
17. Двойник Короля
Фантастика:
аниме
фэнтези
попаданцы
5.00
рейтинг книги
Двойник короля 17

Апокриф

Вайс Александр
10. Фронтир
Фантастика:
боевая фантастика
космическая фантастика
космоопера
5.00
рейтинг книги
Апокриф

Кодекс Охотника. Книга XIX

Винокуров Юрий
19. Кодекс Охотника
Фантастика:
фэнтези
5.00
рейтинг книги
Кодекс Охотника. Книга XIX

Неучтенный элемент. Том 10

NikL
10. Антимаг. Вне системы
Фантастика:
фэнтези
5.00
рейтинг книги
Неучтенный элемент. Том 10

Ратник

Ланцов Михаил Алексеевич
3. Помещик
Фантастика:
альтернативная история
7.11
рейтинг книги
Ратник

Второгодка. Книга 3. Ученье свет

Ромов Дмитрий
3. Второгодка
Фантастика:
городское фэнтези
сказочная фантастика
альтернативная история
5.00
рейтинг книги
Второгодка. Книга 3. Ученье свет

Рождественский детектив (сборник рассказов)

Полякова Татьяна Викторовна
Детективы:
прочие детективы
6.00
рейтинг книги
Рождественский детектив (сборник рассказов)

Газлайтер. Том 23

Володин Григорий Григорьевич
23. История Телепата
Фантастика:
боевая фантастика
попаданцы
аниме
5.00
рейтинг книги
Газлайтер. Том 23

Печать пожирателя 2

Соломенный Илья
2. Пожиратель
Фантастика:
городское фэнтези
попаданцы
аниме
сказочная фантастика
5.00
рейтинг книги
Печать пожирателя 2

Эпоха Опустошителя. Том I

Павлов Вел
1. Вечное Ристалище
Фантастика:
фэнтези
попаданцы
аниме
5.00
рейтинг книги
Эпоха Опустошителя. Том I

Ведун

Сухов Александр Евгеньевич
1. Второй шанс
Фантастика:
фэнтези
боевая фантастика
альтернативная история
5.00
рейтинг книги
Ведун