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

Маршруты

Отображать маршруты на карте несомненно полезная и нужная функция. В этом примере я покажу как это делать. Кроме маршрута я предлагаю отображать точки прибытия и отправления. Чтобы не создавать новый проект, воспользуемся кодом с примера Добавление меток на карту (MKAnnotation) (он нам больше всего подходит исходя из требований).

 

Теперь добавим в проект файл, в котором хранятся координаты маршрута (скачать его можно здесь). И написаный мной класс, который занимается отрисовкой маршрута по координатам (ссылка на класс). Вы наверное уже догадываетесь, что нам нужно сделать в первую очередь в коде. Да, нам нужно импортирвать только что добавленный класс в файл ViewController.h. После чего перейдем к файлу ViewController.m и в методе viewDidLoad после добавления сегмента вставим следующий код:

 

<code data-result="[object Object]">NSString *filePath = [[NSBundle mainBundle] pathForResource:@"routes" ofType:@"plist"];
NSArray *pointStrings = [NSArray arrayWithContentsOfFile:filePath];

NSMutableArray* points = [NSMutableArray arrayWithCapacity:pointStrings.count];
for(int i = 0; i &lt; pointStrings.count; i++)
{
    NSString* currentPointString = [pointStrings objectAtIndex:i];
    NSArray* latLonArr = [currentPointString componentsSeparatedByString:@","];

    CLLocationDegrees latitude  = [[latLonArr objectAtIndex:0] doubleValue];
    CLLocationDegrees longitude = [[latLonArr objectAtIndex:1] doubleValue];

    CLLocation* currentLocation = [[[CLLocation alloc] initWithLatitude:latitude 
                                                              longitude:longitude] autorelease];
    [points addObject:currentLocation];
}

Annotation *annotation = [Annotation new];
annotation.title = @"Annotation1";
annotation.subtitle = @"My annotation example";
annotation.coordinate = [[points objectAtIndex:0] coordinate];
[map addAnnotation:annotation];
[annotation release];

Annotation *annotation2 = [Annotation new];
annotation2.title = @"Annotation2";
annotation2.subtitle = @"My annotation example";
annotation2.coordinate = [[points objectAtIndex:points.count - 1] coordinate];
[map addAnnotation:annotation2];
[annotation2 release];

self.routeView = [[[UNRouteView alloc] initWithRoute:points mapView:map] autorelease];</code>

 

Для тех, кто читал примеры работы с файловой системой, первые две строчки этого кода не будут новинкой. В них мы моздаем массив с файла routes.plist. Но поскольку коодинаты в этом файле храняться в виде строки, а в качестве разделителя используется просто запятая — мы создаем новый массив, в котором будут храниться координаты как объекты класса CLLocation (чтобы они были понятны нашей карте). Затем, мы запускаем цикл, в котором выполняется вышеописаное преобразование. Кроме этого, мы изменили координаты меток, таким образом, чтобы они стояли в начале и конце маршрута. Последней строкой выполняется отрисовка сформированного маршрута.

 

Кроме этого, нам нужно добавить два метода делегата:

 

<code data-result="[object Object]">- (void)mapView:(MKMapView *)mapView regionWillChangeAnimated:(BOOL)animated
{ 
	routeView.hidden = YES;
}

- (void)mapView:(MKMapView *)mapView regionDidChangeAnimated:(BOOL)animated
{
	routeView.hidden = NO;
	[routeView setNeedsDisplay];
}</code>

 

В методе regionWillChangeAnimated мы прячем наш маршрут. Этот метод вызывается перед скролированием карты. А в regionDidChangeAnimated — перерисовываем маршрут. Этот метод вызывается по окончания скрола.

 

Как вы заметили, в этом примере на рассматривается досконально способ отрисовки маршрута. Мы используем готовый мной написанный класс. Но те, кто хотят докопаться до сути способа рисования — могут заглянуть в реализацию этого класса и подробно его изучить.

 

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

Comments are closed.