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

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

Жанры

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

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

Шрифт:

Сначала давайте реализуем метод mapView: didFailToLocateUserWithError::

— (void) mapView:(MKMapView *)mapView

didFailToLocateUserWithError:(NSError *)error{

UIAlertView *alertView = [[UIAlertView alloc]

initWithTitle:@"Failed"

message:@"Could not get the user's location"

delegate: nil cancelButtonTitle:@"OK"

otherButtonTitles: nil];

[alertView show];

}

Элементарно.

Переходим к методу mapView: didUpdateUserLocation::

— (void) mapView:(MKMapView *)mapView

didUpdateUserLocation:(MKUserLocation *)userLocation{

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

request.naturalLanguageQuery = @"restaurants";

MKCoordinateSpan span = MKCoordinateSpanMake(0.01, 0.01);

request.region =

MKCoordinateRegionMake(userLocation.location.coordinate, span);

MKLocalSearch *search = [[MKLocalSearch alloc] initWithRequest: request];

[search startWithCompletionHandler:

^(MKLocalSearchResponse *response, NSError *error) {

for (MKMapItem *item in response.mapItems){

NSLog(@"Item name = %@", item.name);

NSLog(@"Item phone number = %@", item.phoneNumber);

NSLog(@"Item url = %@", item.url);

NSLog(@"Item location = %@", item.placemark.location);

}

}];

}

В этом методе все просто. Мы создаем локальный поисковый запрос и устанавливаем в качестве значения его свойства naturalLanguageQuery те элементы, которые мы хотим найти на карте, — в данном случае рестораны. Затем получаем местоположение пользователя и создаем на его основе регион типа MKCoordinateRegion. Мы делаем это потому, что хотим определить область, окружающую пользователя, и выполнить поиск в этой области. Область сообщает движку поиска местоположения о том, что мы хотим ограничить круг поиска заданным регионом. Как только регион создан, задаем его в качестве значения свойства region для локального поиска. Сделав это, можно приступать к поиску. Для этого мы отправляем локальный поисковый запрос методу экземпляра startWithCompletionHandler:, относящемуся к классу MKLocalSearch. Этот метод принимает блок в качестве параметра. Данный блок кода вызывается при поступлении результатов поиска или возникновении ошибки.

Найденные элементы будут записаны в свойстве mapItems параметра отклика нашего блокового объекта, эти картографические элементы будут относиться к типу MKMapItem. У каждого элемента будут свойства — в частности, name, phoneNumber и url — которые помогут нанести на карту интересующие нас точки. При этом мы воспользуемся приемами, изученными ранее в этой главе, — например, отобразим на карте маркеры, о которых

говорили в разделе 9.4.

См. также

Разделы 9.4–9.6.

9.10. Отображение направлений на карте

Постановка задачи

Необходимо отображать на карте направления, подсказывая таким образом пользователю, как попасть из точки А в точку B.

Решение

Инстанцируйте объект типа MKDirections и вызовите метод экземпляра calculateDirectionsWithCompletionHandler:, относящийся к этому объекту. Так будет вызван обработчик завершения, а вам будет передан объект типа MKDirectionsResponse. Воспользуйтесь таким откликом с информацией о направлениях, чтобы открыть на устройстве приложение Maps (Карты). Этому мы также вскоре научимся.

Обсуждение

Вы можете отображать на экране направления, подсказывающие пользователю, как пройти или проехать куда-либо. Но такая возможность доступна только в приложении Maps (Карты). Соответственно, вы не сможете наносить такие линии на карту прямо в картографическом виде внутри приложения. Способ указания направлений на карте в приложении Maps очень прост. Чтобы создать на экране такие линии, потребуется инстанцировать экземпляр класса MKDirections. Для работы с этим классом нужен уже готовый экземпляр MKDirectionsRequest.

Кроме того, для создания запроса на отображение направлений потребуется создать экземпляры MKMapItem. Каждый из таких элементов будет соответствовать точке на карте. Суть такова: если вы хотите отобразить на карте направления, помогающие пользователю найти путь из точки A в точку B, то эти точки потребуется представить в виде элементов карты. На базе информации об этих элементах создается запрос, а затем для получения направлений используется класс MKDirections. После получения направлений можно поступить двумя способами.

• Обработать направления самостоятельно. Например, с помощью одной из техник, изученных ранее в этой главе (см. раздел 9.4), вы можете получить все автозаправки (их метки), расположенные по пути из точки A в точку B, а затем снабдить эти точки на карте маркерами.

• Отправить информацию о направлениях в приложение Maps (Карты) для отображения.

В данном разделе мы исследуем второй вариант. Итак, предположим, что мы хотим показать направления проезда от той точки, в которой сейчас находимся, в другую произвольную точку на карте. В этом разделе мы задаем следующий адрес назначения: Churchill Square Shopping Center, Brighton, United Kingdom (Торговый центр «Черчилль», Брайтон, Соединенное королевство). С помощью технологии, изученной в разделе 9.7, мы сможем преобразовать обычный адрес, выразив его в координатах широты и долготы. Затем воспользуемся этой информацией для создания экземпляра класса MKPlacemark — подробнее об этом в дальнейшем.

Итак, начнем. Первым делом потребуется импортировать фреймворк Core Location, с помощью которого мы сможем преобразовать вышеупомянутый адрес в географические координаты (широту и долготу). Кроме того, импортируем фреймворк MapKit, с помощью которого сможем создать запрос направления. При помощи модулей, работу с которыми обеспечивает LLVM, мы без труда импортируем эти фреймворки в приложение:

#import «AppDelegate.h»

#import <CoreLocation/CoreLocation.h>

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

Эволюционер из трущоб. Том 8

Панарин Антон
8. Эволюционер из трущоб
Фантастика:
попаданцы
аниме
фэнтези
фантастика: прочее
5.00
рейтинг книги
Эволюционер из трущоб. Том 8

Выживший. Чистилище

Марченко Геннадий Борисович
1. Выживший
Фантастика:
попаданцы
альтернативная история
5.38
рейтинг книги
Выживший. Чистилище

Вперед в прошлое 11

Ратманов Денис
11. Вперед в прошлое
Фантастика:
попаданцы
альтернативная история
5.00
рейтинг книги
Вперед в прошлое 11

Черный Маг Императора 14

Герда Александр
14. Черный маг императора
Фантастика:
аниме
сказочная фантастика
фэнтези
фантастика: прочее
попаданцы
5.00
рейтинг книги
Черный Маг Императора 14

Черный Маг Императора 12

Герда Александр
12. Черный маг императора
Фантастика:
юмористическое фэнтези
попаданцы
аниме
сказочная фантастика
фэнтези
5.00
рейтинг книги
Черный Маг Императора 12

Бояръ-Аниме. Газлайтер. Том 35

Володин Григорий Григорьевич
35. История Телепата
Фантастика:
аниме
боевая фантастика
фэнтези
5.00
рейтинг книги
Бояръ-Аниме. Газлайтер. Том 35

Рассвет русского царства. Книга 2

Грехов Тимофей
2. Новая Русь
Фантастика:
альтернативная история
попаданцы
историческое фэнтези
5.00
рейтинг книги
Рассвет русского царства. Книга 2

Возмутитель спокойствия

Владимиров Денис
1. Глэрд
Фантастика:
фэнтези
боевая фантастика
попаданцы
5.00
рейтинг книги
Возмутитель спокойствия

Законник Российской Империи

Ткачев Андрей Юрьевич
1. Словом и делом
Фантастика:
городское фэнтези
альтернативная история
аниме
5.00
рейтинг книги
Законник Российской Империи

Стеллар. Трибут

Прокофьев Роман Юрьевич
2. Стеллар
Фантастика:
боевая фантастика
рпг
8.75
рейтинг книги
Стеллар. Трибут

Шайтан Иван 3

Тен Эдуард
3. Шайтан Иван
Фантастика:
попаданцы
альтернативная история
7.17
рейтинг книги
Шайтан Иван 3

Личный аптекарь императора. Том 5

Карелин Сергей Витальевич
5. Личный аптекарь императора
Фантастика:
городское фэнтези
попаданцы
аниме
сказочная фантастика
фэнтези
7.50
рейтинг книги
Личный аптекарь императора. Том 5

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

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

Уязвимость

Рам Янка
Любовные романы:
современные любовные романы
7.44
рейтинг книги
Уязвимость