Objective c 在iOS7上的MKMapView中检测MKPolygonView上的点击

Objective c 在iOS7上的MKMapView中检测MKPolygonView上的点击,objective-c,ios7,mkmapview,mkpolygon,Objective C,Ios7,Mkmapview,Mkpolygon,根据我在这个SO问题()上的发现,我实现了一种在MKPolygon上截取点击手势的方法 它在我们的应用程序中运行良好,该应用程序是使用针对iOS 6的Xcode 4.6.3构建的。然而,当我在iOS 7设备上试用时,一切都停止了 具体地 CLLocationCoordinate2D coord = [neighborhoodMap_ convertPoint:point toCoordinateFr

根据我在这个SO问题()上的发现,我实现了一种在MKPolygon上截取点击手势的方法

它在我们的应用程序中运行良好,该应用程序是使用针对iOS 6的Xcode 4.6.3构建的。然而,当我在iOS 7设备上试用时,一切都停止了

具体地

    CLLocationCoordinate2D coord = [neighborhoodMap_ convertPoint:point
                                             toCoordinateFromView:neighborhoodMap_];

    // We get view from MKMapView's viewForOverlay.
    MKPolygonView *polygonView = (MKPolygonView*) view;
    CGPoint polygonViewPoint = [polygonView pointForMapPoint:mapPoint];
    BOOL mapCoordinateIsInPolygon = CGPathContainsPoint(polygonView.path,
                                                        NULL,
                                                        polygonViewPoint,
                                                        NO);
出于某种原因,对CGPathContainsPoint的调用不再返回YES,即使给定的坐标在MKPolygonView中。不确定是否有人遇到过这个问题,但我希望您能提供一些见解


谢谢

我也遇到了同样的问题,在阅读文档时,我发现MKPolygonView在iOS7中已被弃用,应该改用MKPolygonRenderer。

我也遇到了同样的问题,并且能够通过一种变通方法来解决,但它显然看起来像是苹果的一个bug。我注意到,在创建MKpolygonView时,“path”属性并不是空的,而是每当我想要引用它时都是空的。解决方案是向MKPolygonView子类添加另一个属性,如下所示:

@property CGPathRef savedPath;
然后,当它不为空时,您必须分配它:

    polygonOverlay.savedPath = CGPathCreateCopy(polygonOverlay.path);

然后,只要在需要时检查self.savedPath即可。同样,这不是一个永久性的解决方案,但可以解决将应用程序定位到ios7设备上的ios6的问题。

由于iOS 7,您需要使用mkoverlayrender:

BOOL tapInPolygon = NO;
MKOverlayRenderer * polygonRenderer = [mapView rendererForOverlay:polygonOverlay];
if ( [polygonRenderer isKindOfClass:[MKPolygonRenderer class]]) {

    //Convert the point
    CLLocationCoordinate2D  coordinate = [self.mapView convertPoint:tapPoint
                                               toCoordinateFromView:self.mapView];
    MKMapPoint mapPoint = MKMapPointForCoordinate(coordinate);
    CGPoint polygonViewPoint = [polygonRenderer pointForMapPoint:mapPoint];

    // with iOS 7 you need to invalidate the path, this is not required for iOS 8
    [polygonRenderer invalidatePath]; 

    tapInPolygon = CGPathContainsPoint(polygonRenderer.path, NULL, polygonViewPoint, NO);
}

结果表明,polygonView的路径属性为NULL。这绝对是一个奇怪的错误…绝对是一个错误,我有同样的问题。在苹果上记录一张罚单。是的,我已经用一个示例应用程序向苹果提交了一张bug罚单。希望他们能为iOS7 GA解决这个问题。。交叉我的手指,同样的问题。在iOS6上工作得很好!有趣的是,CGPathContainsPoint在第一次点击时返回True,尽管path为Null。但是第二次点击在完全相同的位置不起作用。dfujiwara苹果对你的错误报告有回应吗?我使用以下方法创建覆盖:
polygonOverlay=[[polygonOverlay alloc]initWithPolygon:(MKPolygon*)覆盖]位于viewForOverlay中,其中polygonOverlay是MKPolygonView的子类。在此之后,它为我提供了一个可以保存的path属性。我尝试了这种方法,一旦我引用了要复制到.savedPath中的.path,我的覆盖将不再绘制(而且CGPathContainsPoint命中测试仍然不起作用)。RJDubz也许您可以发布一个更完整的代码示例?请参阅此处,以获得一个对我有用的答案:我还遇到了it不再绘图的问题。我不得不在保存/引用路径的地方玩。我的解决方案可能适用于您的情况,也可能不完全适用于您的情况,因为所有这些都不受支持……但请尝试在代码中的几个不同位置引用.path属性,看看是否可以找到一个不为NULL且仍在屏幕上绘制的属性。这里发布的解决方案也应该可以工作,但我没有测试它以确定:我在字典中保存/缓存savedPath,并试图计算地图上的给定点是否位于任何多边形中时遇到问题。如果你放大/缩小地图,计算似乎不准确。我相信缓存路径不再代表您在更新后的映射中看到的内容。请注意,MKPolygonRenderer仅适用于iOS7。