作者:汽车一族coolboy_518 | 来源:互联网 | 2023-01-29 18:41
我正在尝试学习MapKit
并将其添加MKPolyLine
为覆盖。几个问题:
MKPolyLine
和之间有什么区别MKPolyLineView
。什么时候应该使用哪一个?
对于MKPolyLine
init方法,参数之一是?的泛型type(MKMapPoint
)UnsafePointer
。不太确定那是什么意思。查找各种SO问题,似乎我们应该将CLLocationCoordinate2D
struct 的内存地址作为参数传递,但这对我不起作用。
let testline = MKPolyline()
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 line = MKPolyline.init(points: &testcoords, count: testcoords.count)
mapView.add(testline)
我不断收到"& is not allowed passing array value as 'UnsafePointer" argument"
。
怎么了
1> OOPer..:
1。
MKPolyLine
是一个类,其中包含多个地图坐标以定义折线的形状,非常接近坐标数组。
MKPolyLineView
是一个视图类,用于管理的视觉表示MKPolyLine
。正如凯恩·柴郡(Kane Cheshire)的回答中所述,它已过时,您应该使用MKPolyLineRenderer
。
什么时候应该使用哪一个?
您需要同时使用MKPolyLine
和,MKPolyLineRenderer
如下面的代码所示。
2。
MKPolyLine
有两个初始化器:
init(points: UnsafePointer, count: Int)
init(coordinates: UnsafePointer, count: Int)
当您想传递[CLLocationCoordinate2D]
给时MKPolyLine.init
,您需要使用init(coordinates:count:)
。
(或者,您可以创建的数组MKMapPoint
并将其传递给init(points:count:)
。)
而且,当您要将不可变数组(用声明let
)传递给UnsafePointer
(非可变)时,则无需添加prefix &
。
以下代码实际上是使用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()
}
}