在本机 iOS/objective C 的 Google Maps SDK 中的 InfoWindow/Marker 上添加点击事件
声明:本页面是StackOverFlow热门问题的中英对照翻译,遵循CC BY-SA 4.0协议,如果您需要使用它,必须同样遵循CC BY-SA许可,注明原文地址和作者信息,同时你必须将它归于原作者(不是我):StackOverFlow
原文地址: http://stackoverflow.com/questions/15360483/
Warning: these are provided under cc-by-sa 4.0 license. You are free to use/share it, But you must attribute it to the original authors (not me):
StackOverFlow
Adding Click Event on InfoWindow/Marker in Google Maps SDK for native iOS/objective C
提问by Corona
Simple Question
简单的问题
I′m working on an App for iOS where I embedded the new Google Map for native iOS. Everything works fine except one problem where I can′t find a propper solution for native IOS/ Objective-C neither here nor at google (if there is one please show me and sorry for annoying you)
我正在开发一个适用于 iOS 的应用程序,我在其中嵌入了适用于本机 iOS 的新 Google 地图。一切正常,除了一个问题,我在这里和谷歌都找不到本机 IOS/Objective-C 的合适解决方案(如果有,请告诉我,对不起,打扰你了)
What I want: I want the User to Click on the Marker that opens the Info Window. After If he clicks or taps on the Info Window it should open a New UIView with further Informations.
我想要什么:我希望用户单击打开信息窗口的标记。之后如果他点击或点击信息窗口,它应该打开一个包含更多信息的新 UIView。
How can I do that?
我怎样才能做到这一点?
Thanks for advices
谢谢你的建议
回答by Brian
1.conform to the GMSMapViewDelegate
protocol.
1.符合GMSMapViewDelegate
协议。
@interface YourViewController () <GMSMapViewDelegate>
// your properties
@end
2.set your mapView_
delegate.
2.设置你的mapView_
代表。
mapView_.delegate = self;
3.implement the GMSMapViewDelegate
method
3.实现GMSMapViewDelegate
方法
- (void)mapView:(GMSMapView *)mapView didTapInfoWindowOfMarker:(GMSMarker *)marker {
// your code
}
btw, marker.userData
is useful. you can set your needed data into it and use it in - mapView:didTapInfoWindowOfMarker:
顺便说一句,marker.userData
很有用。您可以将所需的数据设置到其中并在- mapView:didTapInfoWindowOfMarker:
回答by user2115266
where you adding Map,add
在您添加地图的地方,添加
mapView_.delegate=self;
then use this
然后用这个
-(void)mapView:(GMSMapView *)mapView
didTapInfoWindowOfMarker:(id<GMSMarker>)marker{
//info window tapped
}
回答by iman kazemayni
a full answer for swift 4
swift 4 的完整答案
add
GMSMapViewDelegate
as delegateset yourmap delegate like this :
googlemap.delegate = self
add this func
添加
GMSMapViewDelegate
为委托人像这样设置你的地图委托:
googlemap.delegate = self
添加这个功能
func mapView(_ mapView: GMSMapView, didTap marker: GMSMarker) -> Bool { // do something return true }
func mapView(_ mapView: GMSMapView, didTap marker: GMSMarker) -> Bool { // do something return true }
回答by Pratik Gujarati
I am using Google Maps SDK for iOS.
我正在使用适用于 iOS 的 Google Maps SDK。
I have subclassed uiview to create a custom view "InfoWindow" for infowindow.
我已经将 uiview 子类化为 infowindow 创建自定义视图“InfoWindow”。
add @property (nonatomic,retain) UIView *actionOverlayCalloutView; in your viewcontroller's header file.
添加@property (nonatomic,retain) UIView *actionOverlayCalloutView; 在您的视图控制器的头文件中。
- (UIView *)mapView:(GMSMapView *)mapView markerInfoWindow:(GMSMarker *)marker {
if(self.objSelectedParking != nil)
{
float anchorSize = 0.5f;
float infoWindowWidth = 250.0f;
float infoWindowHeight = 250.0f;
[self.actionOverlayCalloutView removeFromSuperview];
InfoWindow *infoWindow = [[InfoWindow alloc] initWithFrame:CGRectMake(0, 0, infoWindowWidth, infoWindowHeight)];
infoWindow.lblTitle.text = self.objSelectedParking.strParkingName;
infoWindow.lblDescription.text = self.objSelectedParking.strParkingDescription;
infoWindow.lblAddress.text = self.objSelectedParking.strParkingAddress;
infoWindow.lblPhone.text = self.objSelectedParking.strParkingPhone;
infoWindow.imageViewParking.image = [UIImage imageNamed:@"parking_image_sample.jpg"];
float offset = anchorSize * M_SQRT2;
self.actionOverlayCalloutView = [[UIView alloc] initWithFrame:CGRectMake(0, 0, infoWindowWidth, infoWindowHeight - offset/2)];
[self.actionOverlayCalloutView setBackgroundColor:[UIColor clearColor]];
self.actionOverlayCalloutView.layer.cornerRadius = 5;
self.actionOverlayCalloutView.layer.masksToBounds = YES;
UIButton *hiddenCloseButton = [[UIButton alloc] initWithFrame:CGRectMake((infoWindow.viewContainer.frame.origin.x + infoWindow.viewContainer.frame.size.width - 30), 10, 20, 20)];
[hiddenCloseButton addTarget:self action:@selector(hiddenCloseButtonClickedInInfowindow:) forControlEvents:UIControlEventTouchUpInside];
[self.actionOverlayCalloutView addSubview:hiddenCloseButton];
UIButton *hiddenDirectionButton = [[UIButton alloc] initWithFrame:CGRectMake((infoWindow.lblAddress.frame.origin.x + infoWindow.lblAddress.frame.size.width + 5), (infoWindow.lblAddress.frame.origin.y - 15), 25, 25)];
[hiddenDirectionButton addTarget:self action:@selector(hiddenDirectionButtonClickedInInfowindow:) forControlEvents:UIControlEventTouchUpInside];
[self.actionOverlayCalloutView addSubview:hiddenDirectionButton];
UIButton *hiddenInfoButton = [[UIButton alloc] initWithFrame:CGRectMake((infoWindow.innerContainerView.frame.origin.x + infoWindow.imageViewParking.frame.origin.x + infoWindow.imageViewParking.frame.size.width + 20), (infoWindow.innerContainerView.frame.origin.y + 25), 25, 25)];
[hiddenInfoButton addTarget:self action:@selector(hiddenInfoButtonClickedInInfowindow:) forControlEvents:UIControlEventTouchUpInside];
[self.actionOverlayCalloutView addSubview:hiddenInfoButton];
UIButton *hiddenScheduleButton = [[UIButton alloc] initWithFrame:CGRectMake((infoWindow.innerContainerView.frame.origin.x + infoWindow.verticalLineSeperatorView.frame.origin.x + infoWindow.verticalLineSeperatorView.frame.size.width + 10), (infoWindow.innerContainerView.frame.origin.y + 25), 25, 25)];
[hiddenScheduleButton addTarget:self action:@selector(hiddenScheduleButtonClickedInInfowindow:) forControlEvents:UIControlEventTouchUpInside];
[self.actionOverlayCalloutView addSubview:hiddenScheduleButton];
[infoWindow addSubview:self.actionOverlayCalloutView];
CLLocationCoordinate2D anchor = [_mapView.selectedMarker position];
CGPoint point = [_mapView.projection pointForCoordinate:anchor];
point.y -= _mapView.selectedMarker.icon.size.height + offset/2 + (infoWindowHeight - offset/2)/2;
self.actionOverlayCalloutView.center = point;
[_mapView addSubview:self.actionOverlayCalloutView];
return infoWindow;
}
return nil;
}
-(void)mapView:(GMSMapView *)pMapView didChangeCameraPosition:(GMSCameraPosition *)position {
if (pMapView.selectedMarker != nil && self.actionOverlayCalloutView.superview)
{
float anchorSize = 0.5f;
float infoWindowHeight = 250.0f;
CLLocationCoordinate2D anchor = [_mapView.selectedMarker position];
CGPoint point = [_mapView.projection pointForCoordinate:anchor];
float offset = anchorSize * M_SQRT2;
point.y -= _mapView.selectedMarker.icon.size.height + offset/2 + (infoWindowHeight - offset/2)/2;
point.y = point.y - 10; //PRATIK GUJARATI CODE TO ADJUST HEIGHT AND Y VALUE OF TRANSPARENT OVERLAY VIEW
self.actionOverlayCalloutView.center = point;
} else {
[self.actionOverlayCalloutView removeFromSuperview];
}
}
- (void)mapView:(GMSMapView *)mapView didTapAtCoordinate:(CLLocationCoordinate2D)coordinate {
[self.actionOverlayCalloutView removeFromSuperview];
}
- (void)observeValueForKeyPath:(NSString *)keyPath ofObject:(id)object change:(NSDictionary *)change context:(void *)context {
if ([keyPath isEqualToString:@"mapView.selectedMarker"]) {
if (!_mapView.selectedMarker) {
[self.actionOverlayCalloutView removeFromSuperview];
}
}
}
回答by Dhananjay Patil
Create one subview which you want to show in infoWindow.
Set frame of subview equals to frame of infoWindow view.
subView = [[[NSBundle mainBundle] loadNibNamed:@"viewName" owner:self options:nil] objectAtIndex:0]; [subView setFrame:infoview.frame]; [self.mapview addSubview:subView];
创建一个要在 infoWindow 中显示的子视图。
设置子视图的框架等于信息窗口视图的框架。
subView = [[[NSBundle mainBundle] loadNibNamed:@"viewName" owner:self options:nil] objectAtIndex:0]; [subView setFrame:infoview.frame]; [self.mapview addSubview:subView];
回答by kiran pm
get information at google map view information
在谷歌地图上获取信息 查看信息
func mapView(_ mapView: GMSMapView, didTapInfoWindowOf marker: GMSMarker) {
print(marker.title!)
print(marker.snippet!)
}
回答by Alessandro Ornano
Swift 5.1
斯威夫特 5.1
You can use GMSMapViewDelegate
with:
您可以使用GMSMapViewDelegate
:
mapView.delegate = self
func mapView(_ mapView: GMSMapView, didTapInfoWindowOf marker: GMSMarker) {
print("InfoView tapped")
}