5

Gesture Recognizer を介して GMSMapView でドラッグ/パン ジェスチャをキャプチャする際に奇妙な問題が発生しています。この問題は、GMS 1.2 から 1.3.1 に更新した後にのみ表面化しまし

タッチは GMSMapView によってより積極的に消費されます

メインビューの下に GMSMapView を保持する UIViewController があります。GMSMapDelegate はドラッグ/パン ジェスチャを処理するためのメソッドを提供しないことがわかったので、UIViewController に UIPanGestureRecognizer を追加し、IBAction セレクターにリンクし、ここにリンクされているスクリーンショットに従って、参照アウトレットとアウトレット コレクションを設定しました: http://i .stack.imgur.com/gktoa.png

したがって、以下のように、ドラッグ アクションは単純にrecognizeDragOnMap:セレクターをトリガーします。

-(IBAction)recognizeDragOnMap:(id)sender {
    NSLog(@"recognizeDragOnMap");

    UIGestureRecognizer *gestureRecognizer = (UIGestureRecognizer *)sender;
    if (gestureRecognizer.state != UIGestureRecognizerStateEnded) {
        NSLog(@"Still dragging");
        return;
    }
    NSLog(@"DragEnded");

    GMSCameraPosition *position;

    if ((position = self.mapView.camera)) {
        self.automaticCameraPositionChange = NO;
        CLLocationCoordinate2D coordinate = [position targetAsCoordinate];
        CLLocation *location = [[CLLocation alloc] initWithLatitude:coordinate.latitude longitude:coordinate.longitude];
        [self.origin dragPinToLocation:location];
    } else {
        NSLog(@"No map camera");
    }
}

このセットアップは、GMS 1.2.0 で完全に機能していました。更新後、GMSMapView は以前と同じようにジェスチャに応答しますが、上記のメソッドは呼び出されません!

何が起きているか、および/またはそれを修正する方法を知っている人はいますか?

4

6 に答える 6

12

バージョン 1.4 以降consumesGesturesInView = NOでは、GMSUISettings オブジェクトで設定するだけです。

そうする場合は、マップを操作したいだけのときにスーパービューに何かをさせる可能性のあるイベントに対処する必要があることに注意してください... つまり、たとえば、GMSMapView をスクロールビューは、ドラッグ時にスクロールビューをスクロールします!

于 2013-11-07T13:37:22.577 に答える
10
mapView.settings.consumesGesturesInView = YES;

も役立ちます。親ビューがジェスチャ認識エンジンを消費していました

と相まって

for (UIGestureRecognizer *gestureRecognizer in mapView.gestureRecognizers) {
    [gestureRecognizer addTarget:self action:@selector(handlePan:)];
}


//////



-(IBAction) handlePan:(UIPanGestureRecognizer*)sender {



    if (sender.state == UIGestureRecognizerStateEnded) {
        CGSize size = mapView.frame.size;
        CGPoint tp = CGPointMake(size.width/2, size.height/2);
        CLLocationCoordinate2D loc = [mapView.projection coordinateForPoint:tp];
        [mapView animateToCameraPosition:[GMSCameraPosition cameraWithTarget:loc zoom:mapView.camera.zoom]];



    }


}

それは素晴らしいです!独自のパン ジェスチャ レコグナイザーを追加する必要さえありません。

于 2014-02-25T06:40:12.887 に答える
3

結局のところGMSMapViewインスタンスは現在、GMSBlockingGestureRecognizerすべてのジェスチャをむさぼり食う を所有しています。したがって、次の 2 つの選択肢がありました。

  • ロード後にこのレコグナイザーを削除しますGMSMapView(それに依存する内部機能を壊す可能性があります)(このように); また
  • 自分のターゲット/アクションをレコグナイザーにアタッチします。

この 2 番目のアプローチを使用すると、 の次のコードが通常UIViewControllerviewDidLoad状態に戻ります。

self.mapView = (RAMapView *)[self.view viewWithTag:1];

for (UIGestureRecognizer *gestureRecognizer in self.mapView.gestureRecognizers) {
    [gestureRecognizer addTarget:self action:@selector(recognizeDragOnMap:)];
}

正直なところ、それは醜い、邪悪なクラッジですが、うまくいきます。:)

于 2013-07-02T21:15:25.580 に答える
0

Google マップにデリゲート メソッドがあります。

- (void)mapView:(GMSMapView *)mapView    didTapAtCoordinate:(CLLocationCoordinate2D)coordinate;
于 2015-07-13T12:16:14.670 に答える