Question simple
Je travaille sur une application pour iOS dans laquelle j'ai intégré la nouvelle carte Google Map pour iOS natif . Tout fonctionne correctement sauf un problème pour lequel je ne trouve pas de solution adaptée à l'IOS/Objective-C natif ni ici ni chez google. (s'il y en a un s'il vous plaît montrez-moi et désolé de vous déranger)
Ce que je veux: Je veux que l'utilisateur clique sur le marqueur qui ouvre la fenêtre d'informations. Après S'il clique ou appuie sur la fenêtre d'information, il devrait ouvrir une nouvelle vue UIV avec des informations supplémentaires.
Comment puis je faire ça?
Merci pour les conseils
1.conform au protocole GMSMapViewDelegate
.
@interface YourViewController () <GMSMapViewDelegate>
// your properties
@end
2. définissez votre délégué mapView_
.
mapView_.delegate = self;
3.implémenter la méthode GMSMapViewDelegate
- (void)mapView:(GMSMapView *)mapView didTapInfoWindowOfMarker:(GMSMarker *)marker {
// your code
}
btw, marker.userData
est utile. vous pouvez y définir vos données nécessaires et les utiliser dans - mapView:didTapInfoWindowOfMarker:
une réponse complète pour Swift 4
ajouter GMSMapViewDelegate
en tant que délégué
définir votre délégué mapmap comme ceci: googlemap.delegate = self
ajouter cette fonction
func mapView(_ mapView: GMSMapView, didTap marker: GMSMarker) -> Bool { // do something return true }
où vous ajoutez la carte, ajoutez
mapView_.delegate=self;
puis utiliser cette
-(void)mapView:(GMSMapView *)mapView
didTapInfoWindowOfMarker:(id<GMSMarker>)marker{
//info window tapped
}
J'utilise Google Maps SDK pour iOS.
J'ai sous-classé uiview pour créer une vue personnalisée "InfoWindow" pour Infowindow.
add @property (nonatomic, keep) UIView * actionOverlayCalloutView; dans le fichier d'en-tête de votre viewcontroller.
- (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];
}
}
}
Créez une sous-vue que vous souhaitez afficher dans infoWindow.
Définissez frame de sous-vue égal à frame de la vue infoWindow.
subView = [[[NSBundle mainBundle] loadNibNamed:@"viewName" owner:self options:nil] objectAtIndex:0];
[subView setFrame:infoview.frame];
[self.mapview addSubview:subView];
obtenir des informations sur google map view information
func mapView(_ mapView: GMSMapView, didTapInfoWindowOf marker: GMSMarker) {
print(marker.title!)
print(marker.snippet!)
}