web-dev-qa-db-fra.com

Ajout d'un événement de clic sur InfoWindow/Marker dans le kit de développement logiciel Google Maps pour iOS natif/objectif C

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

15
Corona

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:

81
Brian

une réponse complète pour Swift 4

  1. ajouter GMSMapViewDelegate en tant que délégué

  2. définir votre délégué mapmap comme ceci: googlemap.delegate = self

  3. ajouter cette fonction

func mapView(_ mapView: GMSMapView, didTap marker: GMSMarker) -> Bool 
            {
               // do something
                return true
            }
2
iman kazemayni

où vous ajoutez la carte, ajoutez 

 mapView_.delegate=self; 

puis utiliser cette

-(void)mapView:(GMSMapView *)mapView
didTapInfoWindowOfMarker:(id<GMSMarker>)marker{

   //info window tapped

}
2
user2115266

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];
    }
}
}
1
Pratik Gujarati
  1. Créez une sous-vue que vous souhaitez afficher dans infoWindow.

  2. 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];
    
0
Dhananjay Patil

obtenir des informations sur google map view information

    func mapView(_ mapView: GMSMapView, didTapInfoWindowOf marker: GMSMarker) {
    print(marker.title!)
    print(marker.snippet!)
}
0
kiran pm