2014-07-17 28 views
9

Tôi muốn vẽ polyline trong ứng dụng Swift của mình.Làm thế nào để sử dụng MKPolylineView trong Swift

đang Swift

class MapViewController: UIViewController, MKMapViewDelegate { 

    @IBOutlet var theMapView: MKMapView 

    override func viewDidLoad() { 
     super.viewDidLoad() 
     setMapView() 
    } 

    func setMapView() { 
     //theMapView.zoomEnabled = false 
     //theMapView.scrollEnabled = false 
     theMapView.rotateEnabled = false 

     // 
     var lat: CLLocationDegrees = 37.586601 
     var lng: CLLocationDegrees = 127.009381 

     // 
     var latDelta: CLLocationDegrees = 0.008 
     var lngDelta: CLLocationDegrees = 0.008 

     var theSpan: MKCoordinateSpan = MKCoordinateSpanMake(latDelta, lngDelta) 

     var initLocation: CLLocationCoordinate2D = CLLocationCoordinate2DMake(lat, lng) 
     var theRegion: MKCoordinateRegion = MKCoordinateRegionMake(initLocation, theSpan) 
     self.theMapView.setRegion(theRegion, animated: true) 

     var locations = [CLLocation(latitude: 37.582691, longitude: 127.011186), CLLocation(latitude: 37.586112,longitude: 127.011047), CLLocation(latitude: 37.588212, longitude: 127.010438)] 
     var coordinates = locations.map({(location: CLLocation) -> CLLocationCoordinate2D in return location.coordinate}) 
     var polyline = MKPolyline(coordinates: &coordinates, count: locations.count) 

     var myPolylineView : MKPolylineView 
     /* error */ 
     myPolylineView.polyline = polyline // #1 
     myPolylineView.strokeColor = UIColor.blueColor() // #2 
     myPolylineView.lineWidth = 5; // #3 
     self.theMapView.addOverlay(myPolylineView) // #4 
     /* ----- */  
    } 
} 

Lỗi:

// #1 <br> 
Cannot assign to 'polyline' in 'myPolylineView' <br> 
// #2 <br> 
'strokeColor' is unvailable: APIs deprecated as iOS 7 and earlier are unavailable in Swift <br> 
// #3 <br> 
'lineWidth' is unvailable: APIs deprecated as iOS 7 and earlier are unavailable in Swift <br> 
// #4 <br> 
Missing argument for parameter 'level' in call <br> 

tôi không thể tìm ra một giải pháp cho việc này.

Trả lời

19

Đầu tiên, thay vì MKPolylineView, bạn phải tạo MKPolylineRenderer.

MKPolylineView không được dùng nữa kể từ iOS 7 và mặc dù bạn vẫn có thể sử dụng nó trong Mục tiêu-C nếu cần, nó không được hỗ trợ trong Swift.

Second, bạn phải tạo và trả về một MKPolylineRenderer trong phương pháp rendererForOverlay đại biểu (không vượt qua nó để addOverlay).

Trong phương thức addOverlay, bạn chuyển đối tượng MKPolyline (không phải là MKPolylineView hoặc MKPolylineRenderer).

(Xem Adding MKOverlayPathRenderer as overlay to MKMapView gets exception cho một lời giải thích về sự khác biệt giữa những gì đối tượng bạn vượt qua để addOverlay vs những gì đối tượng bạn quay trở lại trong rendererForOverlay.)


Vì vậy, trong phương pháp setMapView, loại bỏ các dòng tạo và thiết lập myPolylineView và thay đổi dòng addOverlay tới:

self.theMapView.addOverlay(polyline) 

Sau đó, thực hiện các phương pháp rendererForOverlay:

func mapView(mapView: MKMapView!, rendererForOverlay overlay: MKOverlay!) -> MKOverlayRenderer! { 
    if overlay is MKPolyline { 
     var polylineRenderer = MKPolylineRenderer(overlay: overlay) 
     polylineRenderer.strokeColor = UIColor.blueColor() 
     polylineRenderer.lineWidth = 5 
     return polylineRenderer 
    } 

    return nil 
} 

Đảm bảo chế độ xem bản đồ là delegate được đặt nếu không phương thức ủy nhiệm sẽ không được gọi và lớp phủ sẽ không xuất hiện. Nếu theMapView là một IBOutlet, kết nối ổ cắm delegate hoặc thiết lập nó trong mã (ví dụ trong viewDidLoad sau khi gọi siêu.):

self.theMapView.delegate = self 
+0

tôi đã làm chính xác này nhưng rendererForOverlay giao thức không được gọi .... –

+0

@VanDuTran, đảm bảo những điều sau đây: 1) Cửa sổ xem bản đồ được kết nối, 2) Giao diện bản đồ được kết nối/đặt, 3) phương thức rendererForOverlay được viết đúng chính tả. Nếu vẫn không được gọi, hãy hỏi một câu hỏi mới với các chi tiết của bạn. – Anna

+0

Đó là vì geojson của tôi có một số tọa độ kỳ lạ: "tọa độ": [[294636.0501,5039009.536], [294572.3566,5039049.88]] –

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