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