简单的问题
I'm工作的一个App,我嵌入新的谷歌地图的本地iOS版的iOS。 一切工作正常,除了一个问题,即我不能找到本地IOS / Objective-C的一个propper解决方案不伦不类在谷歌(如果有的话请告诉我,恼人的对不起你)
我想:我希望用户点击打开的信息窗口的标记。 后如果他点击或水龙头上的信息窗口应该打开一个新的UIView进一步的信息。
我怎样才能做到这一点?
感谢您的意见
简单的问题
I'm工作的一个App,我嵌入新的谷歌地图的本地iOS版的iOS。 一切工作正常,除了一个问题,即我不能找到本地IOS / Objective-C的一个propper解决方案不伦不类在谷歌(如果有的话请告诉我,恼人的对不起你)
我想:我希望用户点击打开的信息窗口的标记。 后如果他点击或水龙头上的信息窗口应该打开一个新的UIView进一步的信息。
我怎样才能做到这一点?
感谢您的意见
1.conform到GMSMapViewDelegate
协议。
@interface YourViewController () <GMSMapViewDelegate>
// your properties
@end
2.设置你的mapView_
委托。
mapView_.delegate = self;
3.implement的GMSMapViewDelegate
方法
- (void)mapView:(GMSMapView *)mapView didTapInfoWindowOfMarker:(GMSMarker *)marker {
// your code
}
顺便说一句, marker.userData
是有用的。 你可以设置你需要的数据把它和使用它- mapView:didTapInfoWindowOfMarker:
在这里你将地图,添加
mapView_.delegate=self;
然后用这个
-(void)mapView:(GMSMapView *)mapView
didTapInfoWindowOfMarker:(id<GMSMarker>)marker{
//info window tapped
}
为迅速4一个完整的答案
添加GMSMapViewDelegate
为代表
设置yourmap委托这样的: googlemap.delegate = self
添加该FUNC
func mapView(_ mapView: GMSMapView, didTap marker: GMSMarker) -> Bool { // do something return true }
我使用谷歌地图SDK适用于iOS。
我有子类的UIView创建信息窗口自定义视图“信息窗口”。
添加@属性(非原子,保留)的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];
}
}
}
创建要在信息窗口显示一个子视图。
子视图设置帧等于信息窗口视图的框架。
subView = [[[NSBundle mainBundle] loadNibNamed:@"viewName" owner:self options:nil] objectAtIndex:0]; [subView setFrame:infoview.frame]; [self.mapview addSubview:subView];
在谷歌地图视图信息获取信息
func mapView(_ mapView: GMSMapView, didTapInfoWindowOf marker: GMSMarker) {
print(marker.title!)
print(marker.snippet!)
}