5

根据我在这个 SO 问题上的发现(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。不确定是否有人遇到过这个问题,但我会很感激你的任何见解。

谢谢!

4

3 回答 3

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);
}
于 2014-12-19T14:55:58.400 回答
1

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

于 2013-09-16T08:49:24.927 回答
0

我遇到了同样的问题,并且能够通过一种解决方法来解决它,但它绝对看起来像是苹果端的一个错误。我注意到在创建 MKpolygonView 时“路径”属性不是 NULL,但每当我想引用它时它就是 NULL。解决方案是在 MKPolygonView 子类中添加另一个属性,如下所示:

@property CGPathRef savedPath;

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

    polygonOverlay.savedPath = CGPathCreateCopy(polygonOverlay.path);

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

于 2013-09-23T20:35:11.093 回答