MKPolyline的标注

时间:2019-04-17 15:37:56

标签: swift mapkit

我有一个短行(MKPolyline)和一个自定义注释类(MKPointAnnotaion)。现在,我的点注释位于折线的中点。但是,我希望每当触摸折线上的任何点时都显示标注,类似于在地图中执行路由的方式。由于折线似乎没有注释之类的可触摸属性,是否有办法让注释包含整条线?

我不在乎注解标记(实际上是一个讨厌的东西,宁愿将其隐藏),仅关注标注和相关的类信息。

如果可能的话,有人可以提供简短的示例代码并给出答案吗?

编辑:其他帖子似乎来自5年前,其链接不再起作用

1 个答案:

答案 0 :(得分:2)

一些想法:

  1. 我认为,您希望此标注从何处开始的“添加注释”方法将是最简单的方法。如果您开始考虑制作一个注释视图子类来显示路径,那么我认为这会变得非常繁琐(处理缩放更改,旋转,3D等)。重叠式广告可让您免费获得一系列行为,因此我想您要坚持下去。注释也为您提供了免费的标注行为,所以我想您也应该坚持下去。

  2. 如果您不希望注释视图显示大头针/标记,则只需不要使用MKPinAnnotationViewMKMarkerAnnotationView的子类,而只需使用MKAnnotationView

  3. 棘手的步骤是如何检测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的轮廓有所不同,显然是看与路径的距离。可以想象这也可以。