6

我正在使用谷歌地图 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);
}

原帖

您可能遗漏了两段代码。在头文件中采用 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 回答
3

如果你只想获取标记的位置,有一个位置属性

CLLocationCoordinate2D coord = marker.position;

当此委托方法被调用时

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

根据我的经验,它用于没有标记或覆盖的屏幕点击。

GMSOverlay 有点不同,因为它是 GMSMarker 的超类。您只需要为您的自定义叠加层子类化 GMSOverlay 并添加一个位置属性。当您创建覆盖时,例如在 didTapAtCoordinate 中,您可以在其中指定位置(GPS 坐标)。

于 2014-05-25T19:11:46.663 回答
1

您可以将圆圈设置为不可点击(默认行为)并使用didTapAtCoordinate代表捕捉地图上的所有点击。

然后,当触发此事件时,您可以遍历所有圈子以检查用户是否在其中一个圈子内或外面点击。

于 2015-06-18T16:05:46.997 回答
1

self.mapview.settings.consumesGesturesInView = 否;

在 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

所以你不能让 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 回答
0

您可以继承 UITapGestureRecognizer 并覆盖其 touchesEnded 以检索触摸点,而不是使用 GMSMapView 的坐标点检索坐标。

继承 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 回答