Как создать путь с помощью MKOverlayPathView?

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

Ответы

Ответ 1

Здесь, как создать путь и добавить его в качестве наложения в 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:

- (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 в него с использованием синтаксиса массива и последующее освобождение буфера памяти.