我正在开发一个请求多个方向(MKDirectionsRequest)并在mapView中绘制路线的应用程序,一切正常。
但是我面临一个问题:我想用不同的颜色绘制每条路线。
第一个想法很简单:使用标题/字幕为不同的MKPolyline标记,以便在委托函数中设置所需的颜色:
mapView(_ mapView: MKMapView, rendererFor overlay: MKOverlay) -> MKOverlayRenderer
但是我不喜欢这种解决方案,因为它太丑陋了,我将不得不通过一个不同的参数(流量..)来解析字符串。
第二个简单的解决方案是子类MKPolyline,是的..
因为MKPolyline没有指定的初始化程序,所以这是不可能的(是吗?)
[编辑]:我想创建一个MKPolyline的子类来“复制”由MKDirectionsRequest.routes返回的已创建的MKPolyline,但是我不知道如何覆盖只读参数(Apple表示我们应该覆盖它们在子类中并添加setter,但是我在setter中有一个无限循环,女巫是..正常)
如果使用的是objC,则在运行时“注入”代码并添加我的参数很简单,但是我使用的是swift。
有人可以帮忙吗,谢谢。
最佳答案
不需要自定义渲染器的更简单方法:
import UIKit
import MapKit
class CustomPolyline : MKPolyline {
var color: UIColor?
}
class ViewController: UIViewController, MKMapViewDelegate {
@IBOutlet weak var mapView: MKMapView!
override func viewDidLoad() {
super.viewDidLoad()
// setup mapView
mapView.delegate = self
// set map view region
let location : CLLocationCoordinate2D = CLLocationCoordinate2DMake(51.4987, 0.007);
let viewRegion = MKCoordinateRegionMakeWithDistance(location, 400, 400)
mapView.setRegion(viewRegion, animated:true )
// add red line
let coords1 = [CLLocationCoordinate2D(latitude: 51.499526, longitude: 0.004785),CLLocationCoordinate2D(latitude: 51.500007, longitude: 0.005493)]
let polyline1 = CustomPolyline(coordinates: coords1, count: coords1.count)
polyline1.color = UIColor.red
mapView.add(polyline1)
// add blue line
let coords2 = [CLLocationCoordinate2D(latitude: 51.498103, longitude: 0.007574), CLLocationCoordinate2D(latitude: 51.498190, longitude: 0.009677)]
let polyline2 = CustomPolyline(coordinates: coords2, count: coords2.count)
polyline2.color = UIColor.blue
mapView.add(polyline2)
}
override func didReceiveMemoryWarning() {
super.didReceiveMemoryWarning()
// Dispose of any resources that can be recreated.
}
func mapView(_ mapView: MKMapView, rendererFor overlay: MKOverlay) -> MKOverlayRenderer {
if overlay is CustomPolyline {
let polylineRenderer = MKPolylineRenderer(overlay: overlay)
polylineRenderer.strokeColor = (overlay as! CustomPolyline).color
polylineRenderer.lineWidth = 4
return polylineRenderer
}
return MKOverlayRenderer()
}
}