Dưới đây là cách tạo đường dẫn và thêm đường dẫn đó làm lớp phủ cho MKMapView
. Tôi sẽ sử dụng MKPolylineView
, là lớp con của MKOverlayPathView
và bảo vệ bạn khỏi phải tham chiếu đến bất kỳ CGPath
nào vì bạn thay vì tạo MKPolyline
(chứa dữ liệu của đường dẫn) và sử dụng để tạo MKPolylineView
(biểu thị trực quan) dữ liệu trên bản đồ).
MKPolyline
phải được tạo bằng một mảng C điểm (MKMapPoint
) hoặc một dải tọa độ C (CLLocationCoordinate2D
). Đó là một sự xấu hổ mà MapKit không sử dụng các cấu trúc dữ liệu nâng cao hơn như NSArray
, nhưng cũng vậy! Tôi sẽ giả sử rằng bạn có các đối tượng NSArray
hoặc NSMutableArray
của CLLocation
để minh họa cách chuyển đổi thành mảng dữ liệu C phù hợp với MKPolyline
. Mảng này được gọi là locations
và cách bạn điền vào nó sẽ được xác định bởi ứng dụng của bạn - ví dụ: điền vào bằng cách xử lý các địa điểm liên lạc bởi người sử dụng, hoặc chứa đầy dữ liệu tải về từ một dịch vụ web vv
Trong điều khiển xem đó là chịu trách nhiệm về các 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];
}
Lưu ý rằng self.polyline là khai báo trong .h như:
@property (nonatomic, retain) MKPolyline* polyline;
điều khiển Quan điểm này cũng nên thực hiện phương pháp 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;
}
Bạn có thể chơi với các thuộc tính fillColor, strokeColor và lineWidth để đảm bảo chúng phù hợp với ứng dụng của bạn. Tôi vừa mới đi với một vạch trắng đơn giản, rộng vừa phải ở đây.
Nếu bạn muốn xóa đường đi khỏi bản đồ, ví dụ: để cập nhật nó với một số tọa độ mới, sau đó bạn sẽ làm gì:
[mapView removeOverlay:self.polyline];
self.polyline = nil;
và sau đó lặp lại quá trình trên để tạo một MKPolyline mới và thêm nó vào bản đồ.
Mặc dù trong nháy mắt đầu tiên MapKit có thể trông hơi đáng sợ và phức tạp, có thể dễ dàng thực hiện một số việc như minh họa trong ví dụ này. Bit đáng sợ duy nhất - đối với các lập trình viên không phải là C - ít nhất là sử dụng malloc để tạo một bộ đệm, sao chép CLLocationCoordinates vào nó bằng cách sử dụng cú pháp mảng, sau đó giải phóng bộ nhớ đệm sau đó.
MKOverlayPathView có thuộc tính '-path' mà bạn đặt trực tiếp bằng CGPathRef. Bạn có nhầm lẫn về cách tạo một CGPathRef? –