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

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

Жанры

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

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

Шрифт:

CLPlacemark *placemark = placemarks[0];

/* Результаты получены. */

NSLog(@"Country = %@", placemark.country);

NSLog(@"Postal Code = %@", placemark.postalCode);

NSLog(@"Locality = %@", placemark.locality);

}

else if (error == nil &&

[placemarks count] == 0){

NSLog(@"No results were returned.");

}

else if (error!= nil){

NSLog(@"An error occurred = %@", error);

}

}];

}

— (void)viewDidUnload{

[super viewDidUnload];

self.myGeocoder = nil;

}

Если операция завершится успешно, то в массиве placemarks будут содержаться объекты типа CLPlacemark. Эти объекты будут отмечать адреса, удовлетворяющие значениям широты и долготы, которые мы сообщили методу reverseGeocodeLocation: completionHandler:. Итак, все, что от нас требуется, — убедиться в отсутствии ошибок и в том, что в массиве меток есть как минимум одна метка.

Методы NSLog из приведенного ранее кода выводят в окне консоли адрес, прошедший процедуру обратного геокодирования:

Country = United States

Postal Code = 95472

Locality = Sebastopol

Обсуждение

В каждом приложении имеется лимит объема запросов на обратное геокодирование, которые могут быть выполнены в данном приложении за один день. Этот объем определяется провайдером серверного приложения, обеспечивающего поддержку геолокационных служб в iOS. Существуют различные платные онлайновые сервисы, которые предоставляют разработчикам сторонние API. Я не могу сейчас рекламировать какие-либо из подобных сервисов, но можете сами поискать их в Интернете, если захотите преодолеть ограничения, связанные с обратным геокодированием пространственных координат, существующие в настоящее время в iOS SDK. Чтобы выполнить запрос на обратное геокодирование, нужно создать экземпляр класса CLGeocoder. Этот класс требует активного сетевого соединения — оно необходимо для успешной обработки запросов. Значения, прошедшие обратное геокодирование, сообщаются блоку обработки завершения, который передается методу reverseGeocodeLocation: completionHandler:.

См. также

Раздел 9.7.

9.9. Поиск в картографическом виде

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

Требуется предоставить пользователям, просматривающим картографический вид, поисковую функцию. Например, можно помочь им найти все рестораны или тренажерные залы в конкретном регионе, отображенном на карте. Если пользователь находится в центре города и видит свое местоположение на карте, он может просто ввести в строку поиска слово «рестораны» — и приложение выполнит поиск по такому запросу.

Решение

Картографические виды, без преувеличения, просто великолепны. Но иногда такой вид ничем не может помочь пользователю, который видит на экране просто одну большую карту. В таком случае вполне сгодится и обычная бумажная карта. Картографические возможности смартфонов интересны именно в контексте их интерактивности. Пользователь может находить на карте объекты, искать интересующие его места, получать информацию о том, как попасть в место, расположенное по тому или иному адресу. Apple включила в iOS SDK три очень удобных класса, позволяющих пользователю искать места на карте. Такой поиск совершенно прост. От вас требуется всего лишь ввести текстовый запрос о том, что вас интересует, например «рестораны» или «кафе, — и SDK выполнит за вас остальную работу. В этом разделе мы собираемся отобразить в контроллере вида картографический вид (с местоположением пользователя) и отслеживать местоположение пользователя. Таким образом, та точка, в которой он находится, всегда будет располагаться в центре карты.

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

#import «ViewController.h»

#import <MapKit/MapKit.h>

@interface ViewController <MKMapViewDelegate>

@property (nonatomic, strong) MKMapView *myMapView;

@end

@implementation ViewController

Далее необходимо создать картографический вид:

— (void)viewDidLoad {

[super viewDidLoad];

/* Создаем карту, совпадающую по размеру с нашим видом */

self.myMapView = [[MKMapView alloc]

initWithFrame: self.view.bounds];

self.myMapView.delegate = self;

/* Задаем для карты тип 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: — вызывается в делегате картографического вида всякий раз, когда информация о местоположении пользователя обновляется. Таким образом, он всегда соответствует успешному варианту развития бизнес-логики. В этом методе можем реализовать локальную функцию поиска.

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

Студиозус 2

Шмаков Алексей Семенович
4. Светлая Тьма
Фантастика:
юмористическое фэнтези
городское фэнтези
аниме
5.00
рейтинг книги
Студиозус 2

Дважды одаренный. Том VI

Тарс Элиан
6. Дважды одаренный
Фантастика:
аниме
альтернативная история
фэнтези
фантастика: прочее
5.00
рейтинг книги
Дважды одаренный. Том VI

Чужбина

Седой Василий
2. Дворянская кровь
Фантастика:
попаданцы
альтернативная история
5.00
рейтинг книги
Чужбина

Гримуар темного лорда III

Грехов Тимофей
3. Гримуар темного лорда
Фантастика:
фэнтези
попаданцы
аниме
5.00
рейтинг книги
Гримуар темного лорда III

Изгой Проклятого Клана

Пламенев Владимир
1. Изгой
Фантастика:
попаданцы
аниме
фэнтези
5.00
рейтинг книги
Изгой Проклятого Клана

Разведчик. Заброшенный в 43-й

Корчевский Юрий Григорьевич
Героическая фантастика
Фантастика:
боевая фантастика
попаданцы
альтернативная история
5.93
рейтинг книги
Разведчик. Заброшенный в 43-й

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

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

Последний Герой. Том 4

Дамиров Рафаэль
Последний герой
Фантастика:
попаданцы
альтернативная история
5.00
рейтинг книги
Последний Герой. Том 4

Неудержимый. Книга XXVII

Боярский Андрей
27. Неудержимый
Фантастика:
фэнтези
попаданцы
5.00
рейтинг книги
Неудержимый. Книга XXVII

Купеческая дочь замуж не желает

Шах Ольга
Фантастика:
фэнтези
6.89
рейтинг книги
Купеческая дочь замуж не желает

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

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

Новик

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

Неудержимый. Книга XIX

Боярский Андрей
19. Неудержимый
Фантастика:
фэнтези
попаданцы
аниме
5.00
рейтинг книги
Неудержимый. Книга XIX

Отморозок 2

Поповский Андрей Владимирович
2. Отморозок
Фантастика:
попаданцы
5.00
рейтинг книги
Отморозок 2