我有一个短行(MKPolyline)和一个自定义注释类(MKPointAnnotaion)。现在,我的点注释位于折线的中点。但是,我希望每当触摸折线上的任何点时都显示标注,类似于在地图中执行路由的方式。由于折线似乎没有注释之类的可触摸属性,是否有办法让注释包含整条线?
我不在乎注解标记(实际上是一个讨厌的东西,宁愿将其隐藏),仅关注标注和相关的类信息。
如果可能的话,有人可以提供简短的示例代码并给出答案吗?
编辑:其他帖子似乎来自5年前,其链接不再起作用
答案 0 :(得分:2)
一些想法:
我认为,您希望此标注从何处开始的“添加注释”方法将是最简单的方法。如果您开始考虑制作一个注释视图子类来显示路径,那么我认为这会变得非常繁琐(处理缩放更改,旋转,3D等)。重叠式广告可让您免费获得一系列行为,因此我想您要坚持下去。注释也为您提供了免费的标注行为,所以我想您也应该坚持下去。
如果您不希望注释视图显示大头针/标记,则只需不要使用MKPinAnnotationView
或MKMarkerAnnotationView
的子类,而只需使用MKAnnotationView
。
棘手的步骤是如何检测MKPolylineRenderer
上的敲击。一种想法是创建一条跟踪MKPolyline
的路径轮廓的路径。
extension MKPolyline {
func contains(point: CGPoint, strokeWidth: CGFloat = 44, in mapView: MKMapView) -> Bool {
guard pointCount > 1 else { return false }
let path = UIBezierPath()
path.move(to: mapView.convert(from: points()[0]))
for i in 1 ..< pointCount {
path.addLine(to: mapView.convert(from: points()[i]))
}
let outline = path.cgPath.copy(strokingWithWidth: strokeWidth, lineCap: .round, lineJoin: .round, miterLimit: 0)
return outline.contains(point)
}
}
其中
extension MKMapView {
func convert(from mapPoint: MKMapPoint) -> CGPoint {
return convert(mapPoint.coordinate, toPointTo: self)
}
}
然后,您可以创建一个手势识别器来检测点击,并检查它是否在概述MKPolyline
的路径之内,或其他。但这是解决方案的基本内容。
很显然,answers here的轮廓有所不同,显然是看与路径的距离。可以想象这也可以。