在iOS7上的MKMapView中检测点击MKPolygonView

时间:2013-08-28 00:16:43

标签: objective-c ios7 mkmapview mkpolygon

基于我在这个SO问题(Touch events on MKMapView's overlays)上发现的内容,我实现了一种拦截MKPolygon上的轻击手势的方法。

我们在使用Xcode 4.6.3针对iOS 6构建的应用程序中运行良好。但是当我在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);

由于某种原因,即使给定的坐标在MKPolygonView中,对CGPathContainsPoint的调用也不再返回YES。不确定是否有人遇到过这个问题,但我很感激您的任何见解。

谢谢!

3 个答案:

答案 0 :(得分:2)

从iOS 7开始,您需要使用MKOverlayRenderer:

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);
}

答案 1 :(得分:1)

我遇到了同样的问题,只是阅读了文档,我发现在iOS7中不推荐使用MKPolygonView,而应该使用MKPolygonRenderer。

答案 2 :(得分:0)

我遇到了同样的问题并且能够通过解决方法修复它,但它肯定看起来像是苹果公司的一个错误。我注意到,当创建MKpolygonView时,“path”属性不是NULL,但只要我想引用它就是NULL。解决方案是将另一个属性添加到MKPolygonView子类,如下所示:

@property CGPathRef savedPath;

然后你必须在它不是NULL时分配它:

    polygonOverlay.savedPath = CGPathCreateCopy(polygonOverlay.path);

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