- Фантастика и фэнтези
- Ироническое фэнтези
- Стимпанк
- Детективная фантастика
- Киберпанк
- Попаданцы
- LitRPG
- Космоопера
- Технофэнтези
- Городская фантастика
- Русское фэнтези
- Юмористическая фантастика
- Космическая фантастика
- Боевое фэнтези
- Эпическая фантастика
- Зарубежная фантастика
- Книги магов
- Мистика
- Разная фантастика
- Разное фэнтези
- Любовное фэнтези
- Романтическая фантастика
- Городское фентези
- Историческая фантастика
- Историческое фэнтези
- Социально-философская фантастика
- Сказочная фантастика
- Иностранное фэнтези
- Романтическое фэнтези
- Ироническая фантастика
- Ужасы и Мистика
- Постапокалипсис
- Героическая фантастика
- Фэнтези
- Научная Фантастика
- Социально-психологическая
- Альтернативная история
- Боевая фантастика
- Разная литература
- Пословицы, поговорки
- Шахматы
- Визуальные искусства
- Фанфик
- Авто и ПДД
- Военное
- Отраслевые издания
- Гиды, путеводители
- Зарубежная образовательная литература
- Военная история
- Цитаты из афоризмов
- Современная литература
- Великолепные истории
- Начинающие авторы
- Современная зарубежная литература
- Боевые искусства
- Изобразительное искусство, фотография
- Кино
- Литература 19 века
- Недвижимость
- Музыка, музыканты
- Готические новеллы
- Истории из жизни
- Культура и искусство
- Спецслужбы
- Зарубежная прикладная литература
- Музыка, танцы
- Подростковая литература
- Прочее
- Военная техника, оружие
- Газеты и журналы
- Периодические издания
- Домоводство, Дом и семья
- Любовные романы
- Экономическая литература
- Научные и научно-популярные книги
- О животных
- Биохимия
- Культурология
- Юриспруденция
- Политика
- Психотерапия
- Языкознание
- Научпоп
- Медицина
- Психология, личное
- Радиотехника
- Филология
- Педагогика
- Образовательная литература
- Деловая литература
- Физика
- Науки: разное
- Химия
- Воспитание детей, педагогика
- Детская психология
- Зарубежная публицистика
- Биология
- Архитектура
- Зарубежная психология
- Науки о космосе
- Социология
- Математика
- География
- Беременность, ожидание детей
- Литературоведение
- Транспорт, военная техника
- Обществознание
- Зоология
- География
- Альтернативная медицина
- Иностранные языки
- Ветеринария
- Рефераты
- Астрология
- Биофизика
- Экология
- История Европы
- Учебники
- Шпаргалки
- Государство и право
- Ботаника
- Религиоведение
- История
- Техническая литература
- Прочая научная литература
- Психология
- Детективы и Триллеры
- Справочная литература
- Проза
- Новелла
- Юмор
- Проза
- Историческая проза
- Русская современная проза
- Советская классическая проза
- Повести
- Очерки
- Эссе
- Рассказы
- Зарубежная современная проза
- Сентиментальная проза
- Зарубежная классика
- Афоризмы
- Эпистолярная проза
- Феерия
- Семейный роман/Семейная сага
- Разное
- Антисоветская литература
- Магический реализм
- Русская классическая проза
- Современная проза
- О войне
- Контркультура
- Классическая проза
- Поэзия, Драматургия
- Детская литература
- Детская фантастика
- Детские остросюжетные
- Детские стихи
- Детские приключения
- Внеклассное чтение
- Учебная литература
- Зарубежные детские книги
- Бизнес
- Загадки
- Книги для подростков
- Школьные учебники
- Детский фольклор
- Книги для дошкольников
- Детские детективы
- Детская познавательная и развивающая литература
- Буквари
- Прочая детская литература
- Сказка
- Детская проза
- Детская образовательная литература
- Юмор
- Документальные книги
- Бизнес
- Внешнеэкономическая деятельность
- Тайм-менеджмент
- Кадровый менеджмент
- О бизнесе популярно
- Управление, подбор персонала
- Бизнес
- Менеджмент и кадры
- Продажи
- Экономика
- Ценные бумаги и инвестиции
- Малый бизнес
- Делопроизводство, офис
- Корпоративная культура, бизнес
- Банковское дело
- Финансы
- Зарубежная деловая литература
- Ораторское искусство / риторика
- Личные финансы
- Интернет-бизнес
- Поиск работы
- Государственное и муниципальное управление
- Бухучет и аудит
- Работа с клиентами
- Менеджмент
- Краткое содержание
- Личная эффективность
- Переговоры
- Приключения
- Старинная литература
- Религия и духовность
- Компьютеры и Интернет
- Блог
Читаем без скачивания iOS. Приемы программирования - Вандад Нахавандипур
Шрифт:
Интервал:
Закладка:
Решение
Инстанцируйте объект типа 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>
#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]
launchOptions:@{
MKLaunchOptionsDirectionsModeKey:
MKLaunchOptionsDirectionsModeDriving}];
}];
Теперь, если объединить весь написанный код, он получится довольно компактным:
#import «AppDelegate.h»
#import <CoreLocation/CoreLocation.h>
#import <MapKit/MapKit.h>
@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){
/* Здесь обрабатываем ошибку, например отобразив окно