• MKMapTypeSatellite — позволяет отобразить вид карты, выполненной со спутника (как показано на рис. 9.1);

• MKMapTypeHybrid — дает возможность накладывать стандартную карту на спутниковую.

<p>9.2. Обработка событий картографического вида</p><p>Постановка задачи</p>

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

<p>Решение</p>

Присвойте объект делегата, соответствующий протоколу MKMapViewDelegate, свойству delegate, которое относится к экземпляру класса MKMapView:

— (void)viewDidLoad{

[super viewDidLoad];

/* Создаем карту размером с наш вид. */

self.myMapView = [[MKMapView alloc]

initWithFrame: self.view.bounds];

/* Задаем Satellite в качестве типа карты. */

self.myMapView.mapType = MKMapTypeSatellite;

self.myMapView.delegate = self;

self.myMapView.autoresizingMask =

UIViewAutoresizingFlexibleWidth |

UIViewAutoresizingFlexibleHeight;

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

[self.view addSubview: self.myMapView];

}

Этот код легко запустить в методе viewDidLoad, относящемся к объекту контроллера вида, если объект имеет свойство MapView типа MKMapView:

#import 

#import 

@interface ViewController () 

@property (nonatomic, strong) MKMapView *myMapView;

@end

@implementation ViewController

<p>Обсуждение</p>

Объект, являющийся делегатом экземпляра класса MKMapView, должен реализовывать методы, описанные в протоколе MKMapViewDelegate. Эти методы необходимы для получения различных сообщений от картографического вида и, как будет показано позднее, для предоставления информации картографическому виду. В протоколе MKMapViewDelegate определяются различные методы, в том числе метод mapViewWillStartLoadingMap:, вызываемый в объекте делегата всякий раз, когда начинается процесс загрузки карты. Не забывайте, что делегат для картографического вида не является обязательным объектом, то есть картографические виды можно создавать и не присваивая им делегатов. Просто картографические виды, лишенные делегатов, не будут реагировать на действия пользователя.

Вот список некоторых методов, объявляемых в протоколе MKMapViewDelegate (здесь также рассказано, о чем они должны сообщать объекту-делегату экземпляра MKMapView):

• mapViewWillStartLoadingMap: — вызывается применительно к объекту делегата всякий раз, когда картографический вид начинает загружать данные, обеспечивающие визуальное представление карты пользователю;

• mapView: viewForAnnotation: — вызывается применительно к объекту делегата всякий раз, когда картографический вид требует от экземпляра MKAnnotationView снабдить карту визуальными аннотациями. Подробнее об этом механизме будет рассказано в разделе 9.4;

• mapViewWillStartLocatingUser: — как понятно из названия, метод вызывается применительно к объекту делегата всякий раз, когда картографический вид приступает к определению местоположения пользователя. Подробнее о том, как сделать это, будет рассказано в разделе 9.3;

• mapView: regionDidChangeAnimated: — вызывается применительно к объекту делегата всякий раз, когда изменяется регион, отображаемый на карте.

<p>См. также</p>

Разделы 9.3 и 9.4.

<p>9.3. Отметка местоположения устройства</p><p>Постановка задачи</p>

Необходимо найти широту и долготу той точки, в которой находится устройство.

<p>Решение</p>

Воспользуйтесь классом CLLocationManager:

— (void)viewDidLoad {

[super viewDidLoad];

if ([CLLocationManager locationServicesEnabled]){

self.myLocationManager = [[CLLocationManager alloc] init];

self.myLocationManager.delegate = self;

[self.myLocationManager startUpdatingLocation];

} else {

/* Геолокационные службы не активизированы.

Попробуйте исправить ситуацию: например предложите пользователю

включить геолокационные службы. */

NSLog(@"Location services are not enabled");

}

}

В данном коде myLocationManager — это свойство типа CLLocationManager. В приведенном примере кода данный класс также является делегатом диспетчера местоположения (Location Manager).

<p>Обсуждение</p>
Перейти на страницу:

Все книги серии Бестселлеры O'Reilly

Похожие книги