iOS. Приемы программирования
Шрифт:
Мы
Теперь, когда мы приказали картографическому виду отслеживать местоположение пользователя, необходимо реализовать следующие методы делегатов картографического вида:
• mapView: didFailToLocateUserWithError: — вызывается в делегате, когда картографическому виду не удается определить местоположение пользователя. В этом методе мы выводим для пользователя предупреждение о том, что определить его местоположение не получается;
• mapView: didUpdateUserLocation: — вызывается в делегате картографического вида всякий раз, когда информация о местоположении пользователя обновляется. Таким образом, он всегда соответствует успешному варианту развития бизнес-логики. В этом методе можем реализовать локальную функцию поиска.
Сначала давайте реализуем метод mapView: didFailToLocateUserWithError::
Элементарно. Переходим к методу mapView: didUpdateUserLocation::
В
этом методе все просто. Мы создаем локальный поисковый запрос и устанавливаем в качестве значения его свойства 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. После получения направлений можно поступить двумя способами.