Рейтинговые книги
Читем онлайн iOS. Приемы программирования - Вандад Нахавандипур

Шрифт:

-
+

Интервал:

-
+

Закладка:

Сделать
1 ... 87 88 89 90 91 92 93 94 95 ... 165

}

— (void)locationManager:(CLLocationManager *)manager

didFailWithError:(NSError *)error{

/* Не удалось получить информацию о местоположении пользователя. */

}

— (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");

}

}

Метод экземпляра startUpdateLocation, относящийся к классу CLLocationManager, сообщает делегату о том, удалось или нет получить информацию о местоположении пользователя. Это делается с помощью методов location Manager: didUpdateToLocation: fromLocation: и locationManager: didFailWithError: объекта делегата, именно в таком порядке.

9.4. Отображение маркеров в картографическом виде

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

Необходимо указать пользователю конкретное место на карте.

Решение

Воспользуйтесь встроенными аннотациями для картографических видов. Для этого выполните следующие шаги.

1. Создайте новый класс и назовите его MyAnnotation.

2. Убедитесь, что этот класс соответствует протоколу MKAnnotation.

3. Определите свойство типа CLLocationCoordinate2D для этого класса и назовите данное свойство coordinate. Убедитесь, что задали это свойство как readonly (только для чтения), поскольку свойство coordinate в соответствии с протоколом MKAnnotation определяется как readonly.

4. Далее можно (но не обязательно) определить два свойства типа NSString, а именно title и subtitle, которые могут содержать заголовок и подзаголовок вашего аннотирующего вида. Оба этих свойства также будут readonly.

5. Создайте для вашего класса метод-инициализатор. Этот метод будет принимать параметр типа CLLocationCoordinate2D. В этом методе присвойте переданный параметр местоположения тому свойству, которое мы определили на этапе 3. Поскольку это свойство является readonly, его невозможно присвоить с помощью кода вне области видимости данного класса. Следовательно, инициализатор этого класса действует здесь как перемычка и позволяет опосредованно присваивать значение этому свойству. Такие же операции мы осуществим со свойствами title и subtitle.

6. Инстанцируйте класс MyAnnotation и добавьте его к вашей карте с помощью метода addAnnotation:, относящегося к классу MKMapView.

Обсуждение

Как было рассказано в подразделе «Решение» данного раздела, нам следует создать объект, соответствующий протоколу MKAnnotation, а позже инстанцировать этот объект и передать ему карту для отображения. h-файл этого объекта будет записываться так:

#import <Foundation/Foundation.h>

#import <MapKit/MapKit.h>

@interface MyAnnotation: NSObject <MKAnnotation>

@property (nonatomic, readonly) CLLocationCoordinate2D coordinate;

@property (nonatomic, copy, readonly) NSString *title;

@property (nonatomic, copy, readonly) NSString *subtitle;

— (instancetype)initWithCoordinates:(CLLocationCoordinate2D)paramCoordinates

title:(NSString *)paramTitle

subTitle:(NSString *)paramSubTitle;

@end

В.m-файле класса MyAnnotation мы создаем класс, отвечающий за отображение геолокационной информации, и делаем это следующим образом:

#import «MyAnnotation.h»

@implementation MyAnnotation

— (instancetype)initWithCoordinates:(CLLocationCoordinate2D)paramCoordinates

title:(NSString *)paramTitle

subTitle:(NSString *)paramSubTitle{

self = [super init];

if (self!= nil){

coordinate = paramCoordinates;

title = paramTitle;

subtitle = paramSubTitle;

}

return(self);

}

@end

Позже мы инстанцируем этот класс и добавим его к нашей карте, например к. m-файлу того контроллера вида, который создает и отображает картографический вид:

#import «ViewController.h»

#import «MyAnnotation.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.view addSubview: self.myMapView];

/* Это просто один образец местоположения. */

CLLocationCoordinate2D location =

CLLocationCoordinate2DMake(50.8219 16929 07181, -0.13 81176 71012 87842);

/* Создаем аннотацию, используя информацию о местоположении. */

MyAnnotation *annotation =

[[MyAnnotation alloc] initWithCoordinates: location

title:@"My Title"

subTitle:@"My Sub Title"];

/* И наконец, добавляем аннотацию на карту. */

[self.myMapView addAnnotation: annotation];

@end

На рис. 9.2 показан вывод данной программы в симуляторе iPhone.

Рис. 9.2. Интегрированный в систему стандартный маркер, отображенный на карте

9.5. Отображение разноцветных маркеров в картографическом виде

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

По умолчанию маркеры-индикаторы, которыми отмечаются точки на карте, — красного цвета. Необходимо отображать маркеры различных цветов, а не только стандартного красного.

Решение

Возвращайте вашему картографическому виду экземпляры MKPinAnnotationView. Это делается с помощью метода делегата mapView: viewForAnnotation:.

Каждая аннотация, добавляемая к экземпляру MKMapView, соответствует конкретному виду, который отображается поверх картографического вида. Такие всплывающие виды называются аннотирующими (Annotation Views).

Аннотирующий вид — это объект типа MKAnnotationView, он является подклассом от UIView. Если объект делегата картографического вида реализует метод делегата mapView: viewForAnnotation:, то объект делегата должен будет возвращать экземпляры класса MKAnnotationView, чтобы отображать (а при необходимости — настраивать) аннотирующие виды, которые выводятся поверх картографического вида.

Обсуждение

Чтобы обеспечить в нашей программе возможность настройки цвета меток (цвет будем выбирать из стандартной палитры, предусмотренной для меток в SDK), которые ставятся на картографическом виде для представления аннотаций, нам понадобится возвращать в методе делегата mapView: viewForAnnotation: не экземпляр класса MKAnnotationView, а экземпляр класса MKPinAnnotationView. Не забывайте, что класс MKPinAnnotationView является подклассом MKAnnotationView.

— (MKAnnotationView *)mapView:(MKMapView *)mapView

viewForAnnotation:(id <MKAnnotation>)annotation{

MKAnnotationView *result = nil;

if ([annotation isKindOfClass: [MyAnnotation class]] == NO){

return result;

}

if ([mapView isEqual: self.myMapView] == NO){

/* Мы собираемся обработать это событие только для того Map View,

который создали ранее. */

return result;

}

/* Сначала приводим тип той аннотации, для которой этот Map View

запустил данное сообщение делегата. */

MyAnnotation *senderAnnotation = (MyAnnotation *)annotation;

/* С помощью метода класса, определенного нами в собственном

классе аннотаций, мы попытаемся сделать многоразовый идентификатор

для того маркера, который сейчас создаем. */

NSString *pinReusableIdentifier =

[MyAnnotation

reusableIdentifierforPinColor: senderAnnotation.pinColor];

/* Пользуясь идентификатором, полученным ранее, попытаемся

повторно применить маркер в отправляющем Map View. */

MKPinAnnotationView *annotationView = (MKPinAnnotationView *)

[mapView

dequeueReusableAnnotationViewWithIdentifier: pinReusableIdentifier];

if (annotationView == nil){

/* Если нам не удастся повторно использовать имеющийся маркер,

создадим новый. */

annotationView = [[MKPinAnnotationView alloc]

initWithAnnotation: senderAnnotation

reuseIdentifier: pinReusableIdentifier];

/* Убеждаемся, что видны выноски поверх каждого маркера в случае,

1 ... 87 88 89 90 91 92 93 94 95 ... 165
На этой странице вы можете бесплатно читать книгу iOS. Приемы программирования - Вандад Нахавандипур бесплатно.
Похожие на iOS. Приемы программирования - Вандад Нахавандипур книги

Оставить комментарий