15

semplice domandaAggiunta evento Click on InfoWindow/Marker in Google Maps per iOS SDK nativo/obiettivo C

sto lavorando su un App per iOS in cui ho incorporato il nuovo Google Map per iOS native. Tutto funziona bene tranne un problema dove non riesco a trovare una soluzione propper per IOS nativo/Objective-C né qui né su google (se ce n'è uno per favore mostrami e scusami se ti infastidisce)

Quello che voglio: Desidero che l'utente faccia clic sull'indicatore che apre la finestra informativa. Dopo Se fa clic o tocca la finestra delle informazioni, dovrebbe aprire un nuovo UIView con ulteriori informazioni.

Come posso farlo?

Grazie per consigli

+0

Si chiama Annotazione Disclosure: http: // stackoverflow.com/questions/1433067/adding-an-accessory-view-button-to-the-mkmapview-call-out-annotation – viral

+5

la risposta accettata è pertinente ad Apple MapKit, non a Google Maps ?! –

+0

sì hai ragione. Ed è sempre una vecchia risposta con una vecchia domanda: D – Corona

risposta

76

1.conform al protocollo GMSMapViewDelegate.

@interface YourViewController() <GMSMapViewDelegate> 
// your properties 
@end 

2. set il vostro delegato mapView_.

mapView_.delegate = self; 

3.Attuare il GMSMapViewDelegate metodo

- (void)mapView:(GMSMapView *)mapView didTapInfoWindowOfMarker:(GMSMarker *)marker { 
    // your code 
} 

btw, marker.userData è utile. è possibile impostare i dati necessari in esso e usarlo in - mapView:didTapInfoWindowOfMarker:

+0

risposta chiara e coerente. – andi

+2

Molto interessante il fatto che tu abbia fatto uso di userData. Sono novizio di iOS e Map SDK e non ero a conoscenza di come si possa usare userData. Adesso lo so. Grazie! (il mio caso di studio: ho impostato l'url userdata per visualizzare i dettagli dell'oggetto dal mio servizio REST, che è la fonte dei marcatori da elaborare con ulteriori viste.) – andi

+0

Questa dovrebbe essere la risposta selezionata. Grazie a @Brian –

2

cui si aggiungono mappa, aggiungere

mapView_.delegate=self; 

quindi utilizzare questo

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

    //info window tapped 

} 
1

Sto usando Google Maps SDK per iOS.

Ho sottoclassato uiview per creare una vista personalizzata "FinestraInfo" per la finestra di apertura.

add @property (nonatomic, retain) UIView * actionOverlayCalloutView; nel file di intestazione del tuo 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]; 
    } 
} 
} 
0
  1. crearne una visualizzazione secondaria che si desidera visualizzare in infowindow.

  2. Imposta il fotogramma della sottoview è uguale al fotogramma della vista di InfoWindow.

    subView = [[[NSBundle mainBundle] loadNibNamed:@"viewName" owner:self options:nil] objectAtIndex:0]; 
    [subView setFrame:infoview.frame]; 
    [self.mapview addSubview:subView]; 
    
0

ottenere informazioni a Google informazioni guarda la mappa

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

}

0

una risposta completa per una rapida 4

  1. aggiungere GMSMapViewDelegate come delegato

  2. imposta il delegato della tua mappa in questo modo: googlemap.delegato = auto

  3. aggiungere questo Blocco funz

    func MapView (_ MapView: GMSMapView, didTap marcatore: GMSMarker) -> Bool {

    // do something 
    
        return true 
    
    } 
    
Problemi correlati