2013-08-28 36 views
5

根據我在這個SO問題(Touch events on MKMapView's overlays)上發現的內容,我實現了一種在MKPolygon上攔截水龍頭手勢的方法。在iOS7的MKMapView中檢測MKPolygonView的水龍頭

它在使用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不再返回,即使是在給定座標是MKPolygonView內。不知道是否有人遇到了這個問題,但我希望您能得到任何見解。

謝謝!

+0

事實證明,polygonView的路徑屬性爲NULL。這絕對是一個奇怪的bug .. – dfujiwara

+0

絕對是一個錯誤,我有同樣的問題。用Apple記錄一張票。 – Dwill

+0

是的,我已經提交了一個示例應用程序的蘋果的bug票。希望他們會修復它的iOS7 GA ..橫過我的手指。 – dfujiwara

回答

1

我有同樣的問題,只是閱讀文檔,我發現MKPolygonView已被棄用在iOS7中,應該使用MKPolygonRenderer。

+0

請注意,MKPolygonRenderer僅適用於iOS7。 – sethpollack

0

我遇到了同樣的問題,能夠用解決方法修復它,但它絕對看起來像是蘋果公司的一個bug。我注意到,在創建MKpolygonView時,「path」屬性不是NULL,而是每當我想引用它時都是NULL。解決的辦法是另一個屬性添加到MKPolygonView子如下:

@property CGPathRef savedPath; 

,然後你要當它是不是NULL賦給它:

polygonOverlay.savedPath = CGPathCreateCopy(polygonOverlay.path); 

然後,只需覈對self.savedPath需要時。再次,這不應該是一個永久的解決方案,但將解決在ios7設備上將應用程序定位到ios6的問題。

+0

這對我不起作用,path始終爲空ios7 – Dwill

+0

我使用以下內容來創建覆蓋層:'polygonOverlay = [[PolygonOverlay alloc] initWithPolygon:(MKPolygon *)overlay];'在viewForOverlay中polygonOverlay是一個子類MKPolygonView。在此之後它有一個可以保存的路徑屬性。 – RJDubz

+0

我試過這種方法,一旦我參考.path複製到.savedPath,我的覆蓋不再繪製(並且CGPathContainsPoint命中測試仍然不起作用)。 RJDubz也許你可以發佈更完整的代碼示例? – sethpollack

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); 
}