我正在使用谷歌地图iOS sdk。 我想在用户点击叠加层时获取触摸点的坐标。
有这种委托方法:
- (void)mapView:(GMSMapView *)mapView didTapAtCoordinate:(CLLocationCoordinate2D)coordinate
但是点击叠加层或标记时不会调用它。
我能以编程方式调用它(但是缺少坐标参数 - 这就是我想要的......)? 或从中得到位置:
- (void) mapView: (GMSMapView *) mapView didTapOverlay: (GMSOverlay *) overlay
任何建议都很珍贵!
谢谢!
答案 0 :(得分: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);
}
答案 1 :(得分:2)
如果您只想获得标记的位置,则有一个位置属性
CLLocationCoordinate2D coord = marker.position;
调用此委托方法时
- (void)mapView:(GMSMapView *)mapView didTapAtCoordinate:(CLLocationCoordinate2D)coordinate
它用于屏幕点击,没有标记或覆盖我的expierience。
GMSOverlay有点不同,因为它是GMSMarker的超类。您只需将GMSOverlay子类化为自定义叠加层并添加位置属性。当您创建叠加层时,例如在didTapAtCoordinate中,您可以在那里指定位置(GPS坐标)。
答案 2 :(得分:1)
您可以设置圈子不可点击(默认行为),并使用.col-xs-6:nth-child(odd) {
clear: both;
}
代表捕获地图上的所有点击。
然后,当触发此事件时,您可以遍历所有圈子,以检查用户是否在其中一个圈子内部或外部进行了点击。
答案 3 :(得分: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);
}
答案 4 :(得分: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。
routestring存储坐标和由&#39; /&#39;分隔的ID。这样我们就可以使用string的组件路径来查找它们了。这将分配给折线标题。
现在点击叠加层时:
-(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];
}
我们可以使用我们构建的字符串的组件路径(由&#34; /&#34;分隔)来获取折线的纬度和经度坐标。然后为覆盖项目上的弹出信息指定标记。
答案 5 :(得分:0)
您可以继承UITapGestureRecognizer并覆盖其touchesEnded以检索触摸点,而不是使用GMSMapView的coordinateForPoint检索坐标。
将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