I\'m returning a UIImageView in - (UIView *)mapView:(GMSMapView *)mapView markerInfoWindow:(GMSMarker *)marker;
This UIImageView
loads imag
This is how I fixed the problem using the workaround bellow:
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) {
}];
}
Based on your explanation , I understand you are looking to refresh your currently displayed infowindow after an image download so that the infowindow is redrawn with the new details.
You can do the below steps:
1, Programatically close the infowindow
2, Programatically show the infowindow for the same marker again
@Shady Elyaski's answer is great, here's a swift reinterpretation with Parse, incase anyone else needs a had.
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
}
}
}
}
In GoogleMaps iOS SDK 1.13.0 and above, they have added this functionality. To enable this, simply set the tracksInfoWindowChanges
property on GMSMarker
to YES
.
Example:
- (UIView *)mapView:(GMSMapView *)mapView markerInfoWindow:(GMSMarker *)marker {
marker.tracksInfoWindowChanges = YES;
MyInfoWindow *infoWindow = [[MyInfoWindow alloc] init];
[infoWindow.imageView sd_setImageWithURL:imageUrl];
return infoWindow;
}
Source:
There you are . just a few lines of simple code . This work perfectly for me . Add these lines of code right after you finish download an image I mean in your completionBlock .
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
}
}
Then it works so freaking awesome . The content are reloaded with new image immediately Basically you still have to assign new image to your marker.image to use it in your "markerInfoContents" method
Swift based on Enrico Susatyo solution:
by setting the tracksInfoWindowChanges property of GMSMarker object to true
marker.title = "my marker"
marker.tracksInfoWindowChanges = true