ПРОГРАММИРОВАНИЕ ПОД IPHONE, IPAD OBJECTIVE-C часть 3

Добавление меток на карту (MKAnnotation)

В предыдущем примере мы научились использовать карту и добавлять на нее одну метку (положение устройства на карте). В этом примере я покажу как помечать на карте необходимые места.

 

Чтобы не создавать новый проект с картой, я предлагаю воспользоваться кодом с предыдущего примера.

 

В первую очередь добавим в проект класс, который будет содержать информации о положении метки, ее имени и описании. Я назвал этот класс Annotation. Вот так выглядит его код:

 

Annotation.h

<code data-result="[object Object]">#import &lt;Foundation/Foundation.h&gt;
#import &lt;MapKit/MapKit.h&gt;

@interface Annotation : NSObject &lt;MKAnnotation&gt;

@property (nonatomic, assign) CLLocationCoordinate2D coordinate;
@property (nonatomic, copy) NSString *title;
@property (nonatomic, copy) NSString *subtitle;

@end</code>

 

Annotation.m

<code data-result="[object Object]">#import "Annotation.h"

@implementation Annotation

@synthesize coordinate;
@synthesize title;
@synthesize subtitle;

- (void)dealloc {
    self.title = nil;
    self.subtitle = nil;
    [super dealloc];
}

@end</code>

 

Поскольку структура CLLocationCoordinate2D реализована в фреймверке CoreLocation — добавьте его в проект.

 

Теперь импортируем только что созданный класс в ViewController, а в методе viewDidLoad добавим следующий код:

 

<code data-result="[object Object]">Annotation *annotation = [Annotation new];
annotation.title = @"Annotation1";
annotation.subtitle = @"My annotation example";
annotation.coordinate = CLLocationCoordinate2DMake(48.298674f, 35.395776f);
[map addAnnotation:annotation];
[annotation release];</code>

 

При запуске приложения, кроме синей метки, на карте будет еще одна красная. В изменении цвета метки нам поможет протокол MKMapViewDelegate (подключите его в интерфейсе класса UIViewController) и его метод viewForAnnotation. Если кто-то забыл о том, что такое протокол и как его подключать — можно почитать здесь. Затем следует установить объекту map делегат. Делегатом будет наш контроллер представления (ViewController). Сделать это можно двумя способами. Добавить в метод viewDidLoadстрочку map.delegate = self; или сделать это с помощью конструктора интерфейса. Я выбрал второй способ и если вы тоже — то инспектор связей в вашем проекте должен выглядеть так:

 

 

Теперь добавим сам метод viewForAnnotation:

 

<code data-result="[object Object]">- (MKAnnotationView *)mapView:(MKMapView *)mapView viewForAnnotation:(id &lt;MKAnnotation&gt;)annotation 
{   
    MKPinAnnotationView *annotationView = nil;

    if (annotation != mapView.userLocation) {
        annotationView = [[[MKPinAnnotationView alloc] initWithAnnotation:annotation 
                                                          reuseIdentifier:nil] autorelease];
        if([[annotation title] isEqualToString:@"Annotation1"]) {
            [annotationView setPinColor:MKPinAnnotationColorRed];
        } else {
            [annotationView setPinColor:MKPinAnnotationColorGreen];
        }
    }

    return annotationView;
}</code>

 

Этот метод вызывается при добавлении любой метки (в том числе и той, которая отображает текущее местоположение устройства). Чтобы не изменить синюю метку, я добавил условие (annotation != mapView.userLocation). То есть, если текущая метка не является той, которая отображает положение устройства на карте — мы создаем объект типа MKPinAnnotationView (это визуальное представление метки, подобно тому как мы это делали с таблицами при создании ячеек). Затем в зависимости от значения переменной titleустанавливаем ему цвет и возвращаем его карте.

 

Всего доступно три цвета:

  • MKPinAnnotationColorRed (по умолчанию)
  • MKPinAnnotationColorGreen
  • MKPinAnnotationColorPurple

 

Но у нас добавляется только одна метка и цвет ее будет красный. Чтобы исправить эту ситуацию добавьте в метод viewDidLoad код, который будет добавлять вторую метку.

 

Кроме цвета, у меток есть еще два очень полезных свойства:

 

  • animatesDrop — по умолчанию имеет отрицательное значение и отвечает за добавление на карту метки с анимацией (она будет как бы падать).
  • canShowCallout — по умолчанию имеет отрицательное значение и отвечает за возможность отображения выноски с детальной информацией о метке.

 

Установим эти два значения зеленой метке:

 

<code data-result="[object Object]">- (MKAnnotationView *)mapView:(MKMapView *)mapView viewForAnnotation:(id &lt;MKAnnotation&gt;)annotation 
{   
    MKPinAnnotationView *annotationView = nil;

    if (annotation != mapView.userLocation) {
        annotationView = [[[MKPinAnnotationView alloc] initWithAnnotation:annotation 
                                                          reuseIdentifier:nil] autorelease];
        if([[annotation title] isEqualToString:@"Annotation1"]) {
            [annotationView setPinColor:MKPinAnnotationColorRed];          
        } else {
            [annotationView setPinColor:MKPinAnnotationColorGreen];
            annotationView.animatesDrop = YES;
            annotationView.canShowCallout = YES;
        }
    }

    return annotationView;
}</code>

 

Теперь зеленая метка будет добавляться с анимацией, а при нажатии на нее — будет отображаться вспомогательная информация.

 

Исходный код этого примера можно скачать здесь.

Comments are closed.