我正在努力学习MapKit,并添加一些MKPolyLine作为一个覆盖。几个问题:
MKPolyLine和MKPolyLineView的区别是什么?什么时候应该用哪一种?MKPolyLine init方法,参数之一是UnsafePointer的泛型类型(MKMapPoint)?不太清楚这是什么意思。查找各种这样的问题,似乎我们应该将CLLocationCoordinate2D结构的内存地址作为参数传递,但它对我不起作用。
让testline = MKPolyline()让coords1 =CLLocationCoordinate2D(纬度: 52.167894,经度: 17.077399)让coords2 =CLLocationCoordinate2D(纬度: 52.168776,经度: 17.081326)让coords3 =CLLocationCoordinate2D(纬度: 52.167921,经度: 17.083730)我不断得到一个"& is not allowed passing array value as 'UnsafePointer<MKMapPoint>" argument"。
这里怎么了?
发布于 2017-07-13 07:34:22
1.
MKPolyLine是一个类,它包含多个地图坐标来定义多边形的形状,非常接近于一个坐标数组。MKPolyLineView是一个视图类,它管理MKPolyLine的可视化表示形式。正如在Kane Cheshire's answer中提到的,它已经过时了,您应该使用MKPolyLineRenderer。
什么时候应该使用哪一个?
您需要使用MKPolyLine和MKPolyLineRenderer,如下面的代码所示。
2.
MKPolyLine有两个初始化器:
当您想将[CLLocationCoordinate2D]传递给MKPolyLine.init时,您需要使用init(coordinates:count:)。
(也可以创建一个MKMapPoint数组并将其传递给init(points:count:)。)
当您想将一个不可变的数组(用let声明)传递给UnsafePointer (非可变的)时,您不需要在&前缀。
下面的代码实际上是用Xcode 9 beta 3构建和测试的:
import UIKit
import MapKit
class ViewController: UIViewController, MKMapViewDelegate {
@IBOutlet weak var mapView: MKMapView!
override func viewDidLoad() {
super.viewDidLoad()
// Do any additional setup after loading the view, typically from a nib.
let coords1 = CLLocationCoordinate2D(latitude: 52.167894, longitude: 17.077399)
let coords2 = CLLocationCoordinate2D(latitude: 52.168776, longitude: 17.081326)
let coords3 = CLLocationCoordinate2D(latitude: 52.167921, longitude: 17.083730)
let testcoords:[CLLocationCoordinate2D] = [coords1,coords2,coords3]
let testline = MKPolyline(coordinates: testcoords, count: testcoords.count)
//Add `MKPolyLine` as an overlay.
mapView.add(testline)
mapView.delegate = self
mapView.centerCoordinate = coords2
mapView.region = MKCoordinateRegion(center: coords2, span: MKCoordinateSpan(latitudeDelta: 0.02, longitudeDelta: 0.02))
}
func mapView(_ mapView: MKMapView, rendererFor overlay: MKOverlay) -> MKOverlayRenderer {
//Return an `MKPolylineRenderer` for the `MKPolyline` in the `MKMapViewDelegate`s method
if let polyline = overlay as? MKPolyline {
let testlineRenderer = MKPolylineRenderer(polyline: polyline)
testlineRenderer.strokeColor = .blue
testlineRenderer.lineWidth = 2.0
return testlineRenderer
}
fatalError("Something wrong...")
//return MKOverlayRenderer()
}
}发布于 2017-07-12 22:23:27
将testCoords改为var而不是let。它需要是可变的(变量)才能作为指针传入。
您还试图将一个CLLocationCoordinate2D数组传递到一个需要一个MKMapPoint数组的参数中,或者将您的坐标转换为点,或者使用接受一个坐标数组的函数。
MKPolyLineView是一种将线条绘制到地图上的老方法,苹果的文档称,使用iOS 7及以后的MKPolylineRenderer:https://developer.apple.com/documentation/mapkit/mkpolylineview
https://stackoverflow.com/questions/45066009
复制相似问题