基于我在这个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。不确定是否有人遇到过这个问题,但我很感激您的任何见解。
谢谢!
答案 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的问题。