5

この SO の質問 ( MKMapView のオーバーレイのタッチ イベント) で見つけたものに基づいて、MKPolygon でタップ ジェスチャをインターセプトする方法を実装しました。

iOS 6 に対して Xcode 4.6.3 を使用してビルドされたアプリでは問題なく動作していましたが、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 を返さなくなりました。誰かがこの問題に遭遇したかどうかはわかりませんが、洞察をいただければ幸いです。

ありがとう!

4

3 に答える 3

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);
}
于 2014-12-19T14:55:58.400 に答える
1

私は同じ問題を抱えていて、ドキュメントを読んだだけで、MKPolygonView が iOS7 で非推奨になり、代わりに MKPolygonRenderer を使用する必要があることがわかりました。

于 2013-09-16T08:49:24.927 に答える
0

私は同じ問題を抱えていて、回避策で修正できましたが、それは間違いなくアップル側のバグのようです. MKpolygonView が作成されたとき、「パス」プロパティは NULL ではなく、参照したいときはいつでも NULL であることに気付きました。解決策は、次のように MKPolygonView サブクラスに別のプロパティを追加することです。

@property CGPathRef savedPath;

そして、NULL でない場合は割り当てる必要があります。

    polygonOverlay.savedPath = CGPathCreateCopy(polygonOverlay.path);

次に、必要に応じて self.savedPath をチェックします。繰り返しますが、これは恒久的な解決策ではありませんが、ios7 デバイスでアプリを ios6 にターゲット設定する問題を解決します。

于 2013-09-23T20:35:11.093 に答える