2013-06-27 10 views
22

Sto tornando a UIImageView in - (UIView *)mapView:(GMSMapView *)mapView markerInfoWindow:(GMSMarker *)marker;Come forzare il contenuto di aggiornamento del markerInfoWindow in Google Maps per iOS SDK

Questo UIImageView carica le immagini in modo dinamico attraverso un URL utilizzando SDWebImage.

Come la documentazione dice di informazioni indicatore di Windows:

Nota: La finestra di informazioni è reso come un'immagine ogni volta che viene visualizzata sulla mappa. Ciò significa che eventuali modifiche alle sue proprietà mentre è attivo non saranno immediatamente visibili. Il contenuto della finestra informativa verrà aggiornato la volta successiva che viene visualizzato.

Il punto è che dopo aver scaricato l'immagine della finestra delle informazioni non si aggiorna e tenere mostrando l'immagine segnaposto finché l'utente nasconde poi vederlo di nuovo ..

quindi ho bisogno di forzare aggiornare il contenuto della il markerInfoWindow nel blocco di immagini scaricato.

risposta

6

Ecco come ho risolto il problema utilizzando la soluzione sotto:

UIImage *img = [[SDWebImageManager sharedManager] imageWithURL:[NSURL URLWithString:Img_URL]]; //Img_URL is NSString of your image URL 
    if (img) {  //If image is previously downloaded set it and we're done. 
     [imageView setImage:img]; 
    }else{ 
     [imageView setImageWithURL:[NSURL URLWithString:Img_URL] placeholderImage:[UIImage imageNamed:@"defaultPin"] success:^(UIImage *image, BOOL cached) { 
      if (!marker.snippet || !cached) { 
       [marker setSnippet:@""];     //Set a flag to prevent an infinite loop 
       if (mapView.selectedMarker == marker) { //Only set if the selected marker equals to the downloaded marker 
        [mpVu setSelectedMarker:marker]; 
       } 
      } 
     } failure:^(NSError *error) { 

     }]; 
    } 
+2

Questa risposta non è più corretta è, vedere la risposta di @Enrico Susatyo sotto (http://stackoverflow.com/a/37064936/1305067). – paulvs

3

In base alla spiegazione, ho capito che stai cercando di aggiornare la tua finestra corrente visualizzata dopo il download di un'immagine in modo che la finestra di navigazione venga ridisegnata con i nuovi dettagli.

Si può fare i passi sotto:

1, Programatically close the infowindow

2, Programatically show the infowindow per lo stesso marcatore di nuovo

0

@Shady La risposta di Elyaski è ottima, ecco una rapida reinterpretazione con Parse, nel caso in cui qualcun altro abbia bisogno di un avanzo.

var eventThumb:UIImage? 
    ... 

    func mapView(mapView: GMSMapView!, markerInfoWindow marker: GMSMarker!) -> UIView! { 


    ... 
    //set up the rest of your view... 
     if let eventImgExists = eventThumb { 
        eventImg.image = eventImgExists 
        self.eventThumb = nil 
       } else { 
        if let currentEventThumb = currentEvent["thumbnail"] as? PFFile { 
         currentEventThumb.getDataInBackgroundWithBlock { 
          (imageData, error) -> Void in 
          if error == nil { 
           let image = UIImage(data: imageData!) 
           eventImg.image = image 
           self.eventThumb = image 
           self.eventsMap.selectedMarker = self.eventsMap.selectedMarker 
          } 
        } 
       } 
      } 
0

Eccoti. solo poche righe di codice semplice. Questo funziona perfettamente per me. Aggiungi queste righe di codice subito dopo aver completato il download di un'immagine Intendo nel tuo completamentoBlock.

 let image = UIImage(contentsOfFile: fileURL.path!) 

     marker.image = image 

      if(self.mapView.selectedMarker != nil) 
      { 
       if(self.mapView.selectedMarker == marker) 
       { 
       self.mapView.selectedMarker = nil 
       self.mapView.selectedMarker = marker 
       } 
      } 

Quindi funziona così impazzire. Il contenuto viene ricaricato immediatamente con la nuova immagine Fondamentalmente devi ancora assegnare una nuova immagine al tuo marker.image per usarlo nel tuo metodo "markerInfoContents"

16

In GoogleMaps iOS SDK 1.13.0 e versioni successive, hanno aggiunto questa funzionalità . Per abilitare ciò, è sufficiente impostare la proprietà tracksInfoWindowChanges su GMSMarker su YES.

Esempio:

- (UIView *)mapView:(GMSMapView *)mapView markerInfoWindow:(GMSMarker *)marker { 
    marker.tracksInfoWindowChanges = YES; 

    MyInfoWindow *infoWindow = [[MyInfoWindow alloc] init]; 
    [infoWindow.imageView sd_setImageWithURL:imageUrl]; 
    return infoWindow; 
} 

Fonte:

+2

perché ci sono voluti 3 anni per implementarlo dal momento del suggerimento? questo è spaventoso – cspam

+5

** Questa è la risposta corretta. ** – paulvs

+0

Grazie amico !!! risparmiato il mio tempo :) –

0

Swift sulla base di soluzione di Enrico Susatyo:

impostando il tracksInfoWindowChanges una proprietà dell'oggetto del GMSMarker true

marker.title = "my marker" 
marker.tracksInfoWindowChanges = true