Как использовать MKPolylineView в Swift
Я хочу нарисовать полилинию в своем приложении 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
/* ----- */
}
}
Ошибки:
// #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>
Я не могу найти решение этого.
1 ответ
Во-первых, вместо MKPolylineView
, вы должны создать MKPolylineRenderer
,
MKPolylineView
устарела с iOS 7, и, хотя вы все равно можете использовать ее в Objective-C, если это необходимо, она не поддерживается в Swift.
Во-вторых, вы должны создать и вернуть MKPolylineRenderer
в rendererForOverlay
метод делегата (не передавать его addOverlay
).
в addOverlay
метод, вы передаете MKPolyline
объект (не MKPolylineView
или же MKPolylineRenderer
).
(См. Добавление MKOverlayPathRenderer, поскольку наложение в MKMapView получает исключение для объяснения разницы между тем, какой объект вы передаете addOverlay
против какого объекта вы возвращаете в rendererForOverlay
.)
Так что в setMapView
метод, удалить строки, которые создают и устанавливают myPolylineView
и изменить addOverlay
линия к:
self.theMapView.addOverlay(polyline)
Затем реализовать 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
}
Убедитесь, что на карте delegate
устанавливается в противном случае метод делегата не будет вызван и оверлей не появится. Если theMapView
это IBOutlet, подключите delegate
выход или установить его в коде (например, в viewDidLoad
после звонка супер)
self.theMapView.delegate = self