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

ЖАНРЫ

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

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

Шрифт:

/* Задаем для карты тип Standard */

self.myMapView.mapType = MKMapTypeStandard;

self.myMapView.autoresizingMask =

UIViewAutoresizingFlexibleWidth |

UIViewAutoresizingFlexibleHeight;

self.myMapView.showsUserLocation = YES;

self.myMapView.userTrackingMode = MKUserTrackingModeFollow;

/* Добавляем ее к нашему виду */

[self.view addSubview: self.myMapView];}

Мы

используем свойство showsUserLocation картографического вида. Это логическое значение. Если оно равно YES, то картографический вид ищет местоположение пользователя (при наличии у нас разрешения на это). Все это, конечно, хорошо, но по умолчанию картографический вид действует так: он находит место на карте и отображает для него аннотацию, но не перемещает центральную точку карты и не увеличивает то место, где располагается пользователь. Иными словами, если в данный момент в картографическом виде отображается карта Великобритании, а пользователь находится где-то в Нью-Йорке, то он по-прежнему будет видеть на экране своего устройства карту Соединенного королевства. Чтобы исправить этот недостаток, нужно задать для свойства userTrackingMode картографического вида значение MKUserTrackingModeFollow, при котором центр картографического вида всегда соответствует местоположению пользователя. Отображаемая часть карты корректируется в соответствии с перемещением пользователя.

Теперь, когда мы приказали картографическому виду отслеживать местоположение пользователя, необходимо реализовать следующие методы делегатов картографического вида:

• mapView: didFailToLocateUserWithError: — вызывается в делегате, когда картографическому виду не удается определить местоположение пользователя. В этом методе мы выводим для пользователя предупреждение о том, что определить его местоположение не получается;

• mapView: didUpdateUserLocation: — вызывается в делегате картографического вида всякий раз, когда информация о местоположении пользователя обновляется. Таким образом, он всегда соответствует успешному варианту развития бизнес-логики. В этом методе можем реализовать локальную функцию поиска.

Сначала давайте реализуем метод 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. После получения направлений можно поступить двумя способами.

Поделиться с друзьями: