Reputation: 353
Based on what I found on this SO question (Touch events on MKMapView's overlays), I have implemented a way to intercept tap gesture on MKPolygon.
It was working fine in our app that was built using Xcode 4.6.3 against iOS 6. However things stopped working when I tried it on iOS 7 devices.
Specifically
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);
For some reason the call to CGPathContainsPoint no longer returns YES even the given coordinates is within the MKPolygonView. Not sure if anyone has hit this problem, but I would appreciate any insights you may have.
Thanks!
Upvotes: 5
Views: 1590
Reputation: 3318
Since iOS 7 you need to use the 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);
}
Upvotes: 2
Reputation: 165
I was having the same problem and was able to fix it with a workaround, but it definitely looks like a bug on apple's end. I noticed that the "path" property was not NULL right as the MKpolygonView was created, but was NULL whenever I wanted to reference it. The solution is to add another property to the MKPolygonView subclass as follows:
@property CGPathRef savedPath;
and then you have to assign it when it's not NULL:
polygonOverlay.savedPath = CGPathCreateCopy(polygonOverlay.path);
Then just check against self.savedPath whenever needed. Again this is not supposed to be a permanent solution, but will solve the issue of targeting apps to ios6 on ios7 devices.
Upvotes: 0
Reputation: 2694
I had the same problem and just reading through the docs I found that MKPolygonView has been deprecated in iOS7 and should use MKPolygonRenderer instead.
Upvotes: 1