27 июля 2010 г.

MapKit в iOS

В моем старом приложении требовалась поддержка прошивки iPhone OS 2.х. Поэтому я не мог использовать все прелести фраемворка MapKit, который появился в 3.0 прошивке. В те далекие времена (около года назад) я отображал карту через UIWebView. Так как сейчас количество устройств с установленной на них прошивками 2.х ничтожно мало, было принято решение переходить на встроеные компоненты отображения карты.

Отобразить в вашем приложении карту можно используя класс MKMapView из фраемворка MapKit. Класс представляется множеством очевидных методов: mapType, zoomEnabled, region, showUserLocation, которые настраивают внешний вид карты. Но это все просто, мне было интересно добавлять на карту свои объекты. С этим мы и будем разбираться в данной статье.

Для добавления на карту элемента привязанного к одной геокоординате используется метод addAnnotation:. В качестве аргумента он принимает объект который наследует протокол MKAnnotation. Протокол реализует методы задания координаты нашей аннотации (coordinate), задание заголовка аннотации (title) и ее текста (subtitle). Вот самый простой пример объекта аннотации:

marker.h
  1. @interface marker : NSObject <MKAnnotation>
  2. {
  3. }
  4. @end


marker.m
  1. #import "marker.h"
  2.  
  3. @implementation marker
  4. #pragma mark MKAnnotation
  5. - (CLLocationCoordinate2D) coordinate
  6. {
  7.   return CLLocationCoordinate2DMake(46.46258530.750186);
  8. }
  9.  
  10. - (NSString *) title
  11. {
  12.   return @"This annotation";
  13. }

создадим экземпляр этого объекта и добавим его на карту:

  1. marker *= [[marker alloc] init];
  2. [mapView addAnnotation:m];
  3. [m release];

довольно просто, правда ведь? Если мы хотим кустимизировать нашу аннотацию, например изменить иконку иголочки, то нам необходимо использовать метод mapView:viewForAnnotation: делегата нашей карты, пример приведен в конце статьи.

Пусть теперь мы хотим нарисовать на карте объект привязанный к нескольким геокоординатам (например маршрут из точки А в точку В). Тут нужно добавлять не аннотацию, а оверлей addOverlay:. Добавим в него MKPolyline:

  1. CLLocationCoordinate2D mapCoords[6];
  2. mapCoords[ 0] = CLLocationCoordinate2DMake(46.476472, 30.704776);
  3. mapCoords[ 1] = CLLocationCoordinate2DMake(46.469664, 30.732229);
  4. mapCoords[ 2] = CLLocationCoordinate2DMake(46.462585, 30.750186);
  5. mapCoords[ 3] = CLLocationCoordinate2DMake(46.447197, 30.743040);
  6. mapCoords[ 4] = CLLocationCoordinate2DMake(46.415384, 30.723226);
  7. mapCoords[ 5] = CLLocationCoordinate2DMake(46.409143, 30.729909);
  8. MKPolyline *polyLine = [MKPolyline polylineWithCoordinates:mapCoords count:6];
  9. [mapView addOverlay:polyLine];
  10. [mapView setDelegate:self];


и в делегате нашей карты зададим свойства этой линии

  1. - (MKOverlayView *)mapView:(MKMapView *)mapView viewForOverlay:(id <MKOverlay>)overlay
  2. {
  3.  MKPolylineView *polylineView = [[[MKPolylineView alloc] initWithOverlay:overlay] autorelease];
  4.  polylineView.strokeColor = [UIColor blueColor];
  5.  polylineView.lineWidth = 3.0;
  6.  return polylineView;
  7. }


Пример проекта.

Так же смотрите:
- Конвертирование "человеческого" адреса в широту и долготу

2 комментария:

  1. Если я не ошибаюсь, это было добавлено только в iOS 4, но расписано все хорошо, Вы мне очень помогли :) Спасибо!

    ОтветитьУдалить
  2. Alexandr
    Маркеры на карте в iPhone OS 3.0 тоже можно было ставить. В iOS 4 добавили возможность добавлять свои вью (MKOverlay).

    ОтветитьУдалить