2011-01-25 44 views
14

Tôi đã xem tài liệu tham khảo về Lớp học iOS của Apple và tiếc là không có gì khôn ngoan hơn. Tôi đã tải về mã mẫu của họ KMLViewer nhưng họ đã quá phức tạp nó ... Tất cả tôi thực sự muốn biết là làm thế nào để tạo ra một con đường và thêm nó vào MKMapView. Các cuộc thảo luận tài liệu về việc sử dụng một CGPathRef, nhưng không thực sự giải thích làm thế nào.Có ai có bất kỳ ví dụ nào về cách tạo đường dẫn bằng MKOverlayPathView không?

Có ai có thể giúp hoặc chỉ cho tôi đúng hướng không? Cảm ơn!

+0

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? –

Trả lời

20

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 đó.

+0

Giải thích rất hay ... Bạn đã cứu ngày của tôi ... Cảm ơn bạn rất nhiều. – viral

+0

Không hoạt động. Phương thức đại biểu, trong đó đặt thuộc tính trực quan của polyline (xem), được gọi là từ đâu? Tôi đặt một bản ghi bên trong nó, và tôi quan sát thấy nó không bao giờ được gọi. Tôi có làm điều gì sai? –

+0

Bạn đã đặt bộ điều khiển chế độ xem của mình là 'MKMapViewDelegate'?Đây là điều sẽ dẫn đến 'mapView: viewForOverlay' đang được gọi. –

Các vấn đề liên quan