检测单击MKPolygon叠加层

时间:2016-08-11 17:28:58

标签: ios swift mapkit mkoverlay mkpolygon

如果轻拍手势在叠加多边形中,我一直试图解决这个问题。

我正在尝试制作国家/地区覆盖图 - 在点击叠加层时我希望能够告诉叠加层的国家/地区。

首先我发现了这个:Detecting touches on MKOverlay in iOS7 (MKOverlayRenderer)而且:detect if a point is inside a MKPolygon overlay建议:

  1. 在触摸点周围做一个小矩形,看看它是否与任何叠加相交。
  2. ```

               //point clicked
               let point = MKMapPointForCoordinate(newCoordinates)
    
               //make a rectangle around this click
               let mapRect = MKMapRectMake(point.x, point.y, 0,0);
    
               //loop through the polygons on the map and 
               for polygon in worldMap.overlays as! [MKPolygon] {
                  if polygon.intersectsMapRect(mapRect) {
                     print("found intersection")
                  }
               }
    

    ```

    1. 使用viewForOverlay具有良好的发声功能CGPathContainsPoint,但现在不推荐使用viewForOverlay
    2. 这导致我找到了Detecting a point in a MKPolygon broke with iOS7 (CGPathContainsPoint),它提出了以下方法:

      1. 从每个叠加层的点创建一个可变多边形(而不是使用已弃用的viewForOverlay),然后如果点击的点位于叠加层中,则使用CGPathContainsPoint返回。 但是,我无法使此代码正常工作。
      2. ```

        func overlaySelected (gestureRecognizer: UIGestureRecognizer) {
            let pointTapped = gestureRecognizer.locationInView(worldMap)
            let newCoordinates = worldMap.convertPoint(pointTapped, toCoordinateFromView: worldMap)
            let mapPointAsCGP = CGPointMake(CGFloat(newCoordinates.latitude), CGFloat(newCoordinates.longitude));
        
            print(mapPointAsCGP.x, mapPointAsCGP.y)    
        
            for overlay: MKOverlay in worldMap.overlays {
                if (overlay is MKPolygon) {
                    let polygon: MKPolygon = (overlay as! MKPolygon)
                    let mpr: CGMutablePathRef = CGPathCreateMutable()
        
                    for p in 0..<polygon.pointCount {
                        let mp = polygon.points()[p]
                        print(polygon.coordinate)
                        if p == 0 {
                            CGPathMoveToPoint(mpr, nil, CGFloat(mp.x), CGFloat(mp.y))
                        }
                        else {
                            CGPathAddLineToPoint(mpr, nil, CGFloat(mp.x), CGFloat(mp.y))
                        }
                    }
        
                    if CGPathContainsPoint(mpr, nil, mapPointAsCGP, false) {
                        print("------ is inside! ------")
                    }
        
                }
            }
        }
        

        ```

        第一种方法有效,但无论我尝试多少小,并在点击点let mapRect = MKMapRectMake(point.x, point.y, 0.00000000001,0.00000000001);周围设置矩形的高度和宽度,水龙头的准确性都不可靠,因此您最终可以点击几个多边形马上。

        目前,我正在努力通过使用&#39; MKPolygon&#39;来决定哪个县更接近水龙头? property coordinate - 它给出了多边形的中心点。然后,可以测量从该多边形到分接点的距离,以找到最接近的一个。但这并不理想,因为用户可能永远无法点击他们想要的国家。

        所以,总结一下我的问题:

        1. 我在上面的第二种方法(使用CGPathContainsPoint)中是否有正确实现的内容?
        2. 使用矩形方法注册点击事件有更准确的方法吗?
        3. 关于如何实现点击地图并查看点击是否在叠加层上的目标的任何其他建议或指示。

0 个答案:

没有答案