dfujiwara
dfujiwara

Reputation: 353

Detecting Tap on MKPolygonView in MKMapView on iOS7

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

Answers (3)

mt81
mt81

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

RJDubz
RJDubz

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

Bach
Bach

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

Related Questions