12

在我今年早些时候提出的一个SO 问题中,我得到了这段代码:

MKPolygonView *polygonView = (MKPolygonView *)[self.mapView viewForOverlay:polygon];
MKMapPoint mapPoint = MKMapPointForCoordinate(tapCoord);
CGPoint polygonViewPoint = [polygonView pointForMapPoint:mapPoint];

if (CGPathContainsPoint(polygonView.path, NULL, polygonViewPoint, FALSE)) {
    // do stuff
}

这在 iOS7 之前都很好用。它现在总是返回 false 并且不会检测路径中的点。

我正在尝试查找任何说明方法更改的文档,但找不到任何文档。

任何想法为什么它坏了?还是新的解决方案?

4

4 回答 4

22

由于某种原因(可能是一个错误),该path属性NULL在 iOS 7 的当前版本中返回。

CGPathRef一种解决方法是从points多边形中构建您自己的。
使用此方法,您不需要引用MKPolygonViewMKPolygonRenderer

例如:

CGMutablePathRef mpr = CGPathCreateMutable();

MKMapPoint *polygonPoints = myPolygon.points;
//myPolygon is the MKPolygon

for (int p=0; p < myPolygon.pointCount; p++)
{
    MKMapPoint mp = polygonPoints[p];
    if (p == 0)
        CGPathMoveToPoint(mpr, NULL, mp.x, mp.y);
    else
        CGPathAddLineToPoint(mpr, NULL, mp.x, mp.y);
}

CGPoint mapPointAsCGP = CGPointMake(mapPoint.x, mapPoint.y);
//mapPoint above is the MKMapPoint of the coordinate we are testing.
//Putting it in a CGPoint because that's what CGPathContainsPoint wants.

BOOL pointIsInPolygon = CGPathContainsPoint(mpr, NULL, mapPointAsCGP, FALSE);

CGPathRelease(mpr);

这也应该适用于 iOS 6。但是,您可能希望仅在覆盖视图的属性返回
时才进行此手动构建。pathNULL

于 2013-09-26T03:16:52.600 回答
2

我遇到了同样的问题。通过在访问路径之前调用 MKPolygonRenderer 上的 invalidatePath 来解决它。

于 2013-12-29T17:52:28.377 回答
1
于 2013-12-05T16:01:30.300 回答
1

它可以直接在 7.1 上运行,但不能在 7.0 上运行。

jdehlin 响应为我解决了 7.0 的问题,即。在每次调用[view invalidatePath] 之前调用

CGPathContainsPoint(polygonView.path, NULL, polygonViewPoint, FALSE)
于 2014-05-07T14:08:43.103 回答