6

私はGoogleマップのiOS SDKを使用しています。ユーザーがオーバーレイをタップしたときに、タッチしたポイントの座標を取得したい。

このデリゲートメソッドがあります:

- (void)mapView:(GMSMapView *)mapView didTapAtCoordinate:(CLLocationCoordinate2D)coordinate

ただし、オーバーレイまたはマーカーをタップしても呼び出されません。

プログラムで呼び出すことはできますか (ただし、座標パラメーターがありません。それが必要です..)? またはこれから場所を取得します:

- (void) mapView: (GMSMapView *) mapView  didTapOverlay: (GMSOverlay *) overlay

どんな提案も貴重です!

ありがとう!

4

6 に答える 6

6

2015 年 6 月 2 日更新

UITapGestureRecognizer をマップにホチキス止めして、タッチ ポイントから座標を抽出するだけです。didTapAtCoordinate と didTapAtOverlay は以前と同様に発火し続けます。

  UITapGestureRecognizer *touchTap = [[UITapGestureRecognizer alloc] initWithTarget:self action:@selector(tapTouchTap:)];
  [self.view addGestureRecognizer:touchTap];

-(void)tapTouchTap:(UITapGestureRecognizer*)touchGesture
{
  CGPoint point = [touchGesture locationInView:self.view];
  CLLocationCoordinate2D coord = [self.mapView.projection coordinateForPoint:point];
  NSLog(@"%f %f", coord.latitude, coord.longitude);
}

元の投稿

2 つのコード スニペットが不足している可能性があります。ヘッダー ファイルで GMSMapViewDelegate を採用します。

@interface Map : UIViewController <GMSMapViewDelegate>

また、viewDidLoad でデリゲートを設定する必要があります。

self.mapView.delegate = self;

これで起動するはずです:

- (void)mapView:(GMSMapView *)mapView didTapAtCoordinate:(CLLocationCoordinate2D)coordinate
{
    NSLog(@"You tapped at %f,%f", coordinate.latitude, coordinate.longitude);
}
于 2014-09-10T19:26:42.117 に答える
1

円をタップ不可に設定し (デフォルトの動作)、didTapAtCoordinateデリゲートでマップ上のすべてのクリックをキャッチできます。

次に、このイベントがトリガーされると、すべての円をループして、ユーザーがいずれかの円の内側をタップしたか、外側をタップしたかを確認できます。

于 2015-06-18T16:05:46.997 に答える
1

self.mapview.settings.consumesGesturesInView = NO;

この行を viewdidload または割り当て後に追加します。

そして、このデリゲート メソッドを実装します。

- (void)mapView:(GMSMapView *)mapView didTapAtCoordinate:(CLLocationCoordinate2D)coordinate
{
    NSLog(@"%g",coordinate);
}


- (void)mapView:(GMSMapView *)mapView didTapOverlay:(GMSOverlay *)overlay
{

    GMSCircle *circle=(GMSCircle *)overlay;
    CLLocationCoordinate2D touchCoOrdinate= circle.position;
    NSLog(@"%g",touchCoOrdinate);
}
于 2015-10-26T12:06:06.490 に答える
0

UITapGestureRecognizer をサブクラス化し、その touchesEnded をオーバーライドして、GMSMapView の座標 ForPoint で座標を取得するよりも、タッチ ポイントを取得できます。

UITapGestureRecognizer をサブクラス化し、mapView に追加します。

self.touchTap = [[TouchGestureRecognizer alloc] initWithTarget:self action:@selector(tapTouchTap)];
self.touchTap.mapView = self.mapView;
[self.view addGestureRecognizer:self.touchTap];

TouchDownGestureRecognizer.h:

#import <UIKit/UIKit.h>    

@interface TouchGestureRecognizer : UITapGestureRecognizer
@property  GMSMapView       *mapView;
@end

TouchDownGestureRecognizer.m:

#import "TouchGestureRecognizer.h"
#import <UIKit/UIGestureRecognizerSubclass.h>

@implementation TouchGestureRecognizer

-(void)touchesEnded:(NSSet *)touches withEvent:(UIEvent *)event
{
  [super touchesEnded:touches withEvent:event];

  UITouch *touch = touches.allObjects[0];
  CGPoint point = [touch locationInView:self.mapView];
  CLLocationCoordinate2D coord = [self.mapView.projection coordinateForPoint:point];
  NSLog(@"%f %f", coord.latitude, coord.longitude);
}

@end
于 2015-07-01T21:16:10.213 に答える
0

したがって、didTapAtCoordinateMethod をオーバーレイ タップに対して起動することはできません。ただし、少し汚い回避策を見つけました。

オーバーレイを使用してポリラインを描画するには、ポリラインがタップされた場所を認識する方法が必要です。したがって、ポリラインを描画するときは、このように作成できます。

    //draw line
    GMSPolyline *polyline = [GMSPolyline polylineWithPath:path];
    polyline.strokeColor = [UIColor purpleColor];
    polyline.tappable = TRUE;
    polyline.map = self.googleMapView;
    polyline.title = routestring;

routestring は構築された文字列です

routestring = [NSString stringWithFormat:@"%@/%@/%@",lat,lng,[annnotationobject objectForKey:@"linkId"]];

lat と lng は座標の文字列値です。最後の部分はポリラインの ID です。

ルート文字列は座標と ID を「/」で区切って保存しているため、文字列のコンポーネント パスを使用して後で検索できます。これはポリラインのタイトルに割り当てられます。

オーバーレイがタップされると:

-(void)mapView:(GMSMapView *)mapView didTapOverlay:(GMSOverlay *)overlay{

NSString *path = overlay.title;

//Finding componentpaths of string
NSArray *pathparts = [path pathComponents];
NSString *lat = [pathparts objectAtIndex:0];
NSString *lng = [pathparts objectAtIndex:1];
NSString *linkID = [pathparts objectAtIndex:2];

//Here we are building a marker to place near the users tap location on the polyline.
GMSMarker *marker = [GMSMarker markerWithPosition:CLLocationCoordinate2DMake([lat doubleValue],[lng doubleValue])];
marker.title = overlay.title;
marker.snippet = @"ROUTE DATA";
marker.map = self.googleMapView;

//This will popup a marker window
[self.googleMapView setSelectedMarker:marker];

}

作成した文字列のコンポーネント パス (「/」で区切られた) を使用して、ポリラインから緯度と経度の座標を取得できます。次に、オーバーレイ アイテムに情報をポップアップするマーカーを割り当てます。

于 2015-01-12T16:58:58.223 に答える