Как создать путь с помощью MKOverlayPathView? - PullRequest
14 голосов
/ 25 января 2011

Я просматривал справочную документацию Apple по классам iOS и, к сожалению, не мудрый. Я скачал их пример кода KMLViewer, но они его слишком усложнили ... Все, что я действительно хочу знать, это как сгенерировать путь и добавить его к MKMapView. В документации говорится об использовании CGPathRef, но на самом деле не объясняется, как.

1 Ответ

20 голосов
/ 19 апреля 2012

Вот как сгенерировать путь и добавить его как оверлей к MKMapView.Я собираюсь использовать MKPolylineView, который является подклассом MKOverlayPathView и защищает вас от необходимости ссылаться на любой CGPath, так как вместо этого вы создаете MKPolyline (содержащий данные пути) и используете этодля создания MKPolylineView (визуальное представление данных на карте).

* MKPolyline должен быть создан с массивом точек C (MKMapPoint) или массивом координат C(CLLocationCoordinate2D).Жаль, что MapKit не использует более сложные структуры данных, такие как NSArray, но так и будет!Я собираюсь предположить, что у вас есть NSArray или NSMutableArray из CLLocation объектов, чтобы продемонстрировать, как преобразовать в массив данных C, подходящий для MKPolyline.Этот массив называется locations, и способ его заполнения будет зависеть от вашего приложения - например, заполнение путем обработки сенсорных местоположений пользователем или заполнение данными, загруженными из веб-службы и т. Д.

В представленииконтроллер, отвечающий за MKMapView:

int numPoints = [locations count];
if (numPoints > 1)
{
    CLLocationCoordinate2D* coords = malloc(numPoints * sizeof(CLLocationCoordinate2D));
    for (int i = 0; i < numPoints; i++)
    {
         CLLocation* current = [locations objectAtIndex:i];
         coords[i] = current.coordinate;
    }

    self.polyline = [MKPolyline polylineWithCoordinates:coords count:numPoints];
    free(coords);

    [mapView addOverlay:self.polyline];
    [mapView setNeedsDisplay];
}

Обратите внимание, что self.polyline объявлен в .h как:

@property (nonatomic, retain) MKPolyline* polyline;

Этот контроллер представления также должен реализовывать MKMapViewDelegate method:

- (MKOverlayView*)mapView:(MKMapView*)theMapView viewForOverlay:(id <MKOverlay>)overlay
{
    MKPolylineView* lineView = [[[MKPolylineView alloc] initWithPolyline:self.polyline] autorelease];
    lineView.fillColor = [UIColor whiteColor];
    lineView.strokeColor = [UIColor whiteColor];
    lineView.lineWidth = 4;
    return lineView;
}

Вы можете поиграть со свойствами fillColor, strokeColor и lineWidth, чтобы убедиться, что они подходят для вашего приложения.Я только что использовал простую, умеренно широкую простую белую линию здесь.

Если вы хотите удалить путь с карты, например, чтобы обновить его новыми координатами, вы должны сделать:

[mapView removeOverlay:self.polyline];
self.polyline = nil;

и затем повторите описанный выше процесс для создания новой MKPolyline и добавления ее на карту.

Хотя MapKit на первый взгляд может показаться немного пугающим и сложным, некоторые из них могут быть легко выполненывещи, как показано в этом примере.Единственный страшный бит - по крайней мере для программистов не на C - это использование malloc для создания буфера, копирования в него CLLocationCoordinates с использованием синтаксиса массива, а затем освобождения буфера памяти.

...