2013-08-28 3 views
5

Основываясь на том, что я нашел в этом вопросе SO (Touch events on MKMapView's overlays), я реализовал способ перехватить жестов tap на MKPolygon.Обнаружение касания MKPolygonView в MKMapView на iOS7

Он отлично работал в нашем приложении, которое было построено с использованием 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); 

По какой-то причине вызов CGPathContainsPoint больше не возвращает YES даже заданные координаты находится в пределах MKPolygonView. Не уверен, что кто-то попал в эту проблему, но я был бы признателен за любые идеи, которые у вас могут быть.

Спасибо!

+0

Оказывается, что путь свойство polygonView является NULL. Это определенно странная ошибка. – dfujiwara

+0

Определенно ошибка, у меня такая же проблема. Зарегистрируйте билет у Apple. – Dwill

+0

Да, я подал ошибку в Apple с образцом приложения. Надеюсь, что они исправит это для iOS7 GA .., пересекая мои пальцы. – dfujiwara

ответ

1

У меня была такая же проблема, и просто прочитав документы, я обнаружил, что MKPolygonView устарел в iOS7 и вместо этого должен использовать MKPolygonRenderer.

+0

Обратите внимание, что MKPolygonRenderer - только iOS7. – sethpollack

0

У меня была такая же проблема, и я смог исправить ее обходным путем, но это определенно похоже на ошибку на конце яблока. Я заметил, что свойство «путь» не было NULL правильно, поскольку MKpolygonView был создан, но был NULL всякий раз, когда я хотел его ссылаться. Решение состоит в том, чтобы добавить другое свойство подкласса MKPolygonView следующим образом:

@property CGPathRef savedPath; 

, а затем вы должны назначить его, когда он не NULL:

polygonOverlay.savedPath = CGPathCreateCopy(polygonOverlay.path); 

Тогда просто проверить против self.savedPath всякий раз, когда это необходимо. Опять же, это не должно быть постоянным решением, но решит проблему ориентации приложений на ios6 на устройствах ios7.

+0

Это не работает для меня, путь всегда равен нулю в ios7 – Dwill

+0

Для создания наложения я использую следующее: 'polygonOverlay = [[PolygonOverlay alloc] initWithPolygon: (MKPolygon *) overlay];' В представленииForOverlay, где polygonOverlay является подклассом MKPolygonView. После этого у меня есть свойство path, которое можно сохранить. – RJDubz

+0

Я пробовал этот подход, и как только я ссылаюсь на .path, чтобы скопировать в .savedPath, мой оверлей больше не рисует (а тестирование CGPathContainsPoint по-прежнему не работает). RJDubz, возможно, вы можете разместить более полный образец кода? – sethpollack

2

С прошивкой 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); 
} 
Смежные вопросы