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

19. Местоположение (Location)

Основы работы с картами (MapKit)

Существует не много способов как объяснить человеку куда ему пройти. Лучший из них — это показать (с помощью карты). Об этом и пойдет речь в данном уроке.

 

Для начала создадим проект на основе шаблона Single View Application и назовем его MyLocation. Чтобы заставить устройство отображать карту — достаточно перетянуть объект MKMapView (с библиотеки объектов интерфейса) на текущий вьюв.

 

 

При запуске приложение вы увидите на экране карту, но не более. Чтобы сделать нашу карту более функциональной — в проект следует добавить фреймверк MapKit.

 

Теперь изменим класс ViewController:

 

ViewController.h

 

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

@interface ViewController : UIViewController

@property (nonatomic, retain) IBOutlet MKMapView *map;

@end</code>

 

ViewController.m

 

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

@implementation ViewController

@synthesize map;

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

- (void)viewDidUnload
{
    [super viewDidUnload];
    self.map = nil;
}

- (void)viewDidLoad
{
    [super viewDidLoad];

}

@end</code>

 

Пока что мы просто добавили объект map типа MKMapView и организовали для него правильную работу с памятью. Свяжите теперь его с объектом MKMapView, который мы добавляли на интерфейс.

 

Самая простая и полезная функция — это отображать свое положение на карте. Для реализации этой функции добавим в метод viewDidLoad одну строчку:

 

<code data-result="[object Object]">map.showsUserLocation = YES;</code>

 

Если теперь запустить проект — на карту будет добавлена синяя метка, но отображать она будет не ваши реальные координаты, а расположение центрального офиса компании Apple. Это связано с тем, что в симуляторе отсутствует модуль GPS. Но если запустить это приложение на реальном устройстве — все будет работать отлично.

 

Все отлично, но это лишь отображение маленькой точки, если мы будем менять свои координаты — карта не будет «следить» за этими изменениями и пользователю постоянно придется искать себя на ней.

 

Для выхода с этой ситуации, в метод viewDidLoad следует добавить еще одну строку:

 

<code data-result="[object Object]">[map setUserTrackingMode:MKUserTrackingModeFollow animated:YES];</code>

 

Теперь, при перемещении устройства — карта будет не только перемещаться так же, но и приближаться к текущему положению. Здесь есть маленькая особенность, карта будет «следить» за изменениями координат устройства до вмешательства пользователя. То есть, если вы попробуете листать карту или изменять ее зум — «слежение» прекратиться. Для его возобновления следует снова воспользоваться методом setUserTrackingMode. Исходя из такого поведения карты рекомендую этот метод добавить в обработку нажатия какой-то кнопки, как это сделано в нативном приложении «Карты».

 

Кроме всего выше описанного, у нас есть возможность изменять тип карты. Изменим файл ViewController.m как это показано ниже.

 

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

@implementation ViewController

@synthesize map;

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

- (void)viewDidUnload
{
    [super viewDidUnload];
    self.map = nil;
}

- (void)viewDidLoad
{
    [super viewDidLoad];

	map.showsUserLocation = YES;
    [map setUserTrackingMode:MKUserTrackingModeFollow animated:YES];

    UISegmentedControl *segmentedControl = [[UISegmentedControl alloc] initWithItems:
                                             [NSArray arrayWithObjects:
                                              @"Карта",
                                              @"Спутник",
                                              @"Гибрид",
                                              nil]];
    [segmentedControl addTarget:self action:@selector(changeMapType:) forControlEvents:UIControlEventValueChanged];
    segmentedControl.frame = CGRectMake(0.0f, 0.0f, 200.0f, 30.0f);
    segmentedControl.selectedSegmentIndex = 0;
    segmentedControl.segmentedControlStyle = UISegmentedControlStyleBar;

    [self.view addSubview:segmentedControl];
    [segmentedControl release];
}

- (void)changeMapType:(UISegmentedControl*)sender {
    if (sender.selectedSegmentIndex == 0) {
        map.mapType = MKMapTypeStandard;
    } else if (sender.selectedSegmentIndex == 1) {
        map.mapType = MKMapTypeSatellite;
    } else if (sender.selectedSegmentIndex == 2) {
        map.mapType = MKMapTypeHybrid;
    }
}

@end</code>

 

Таким образом на карту будет добавлен сегмент с различными вариантами отображения карты.

 

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

Comments are closed.