如何在Google Maps iOS SDK中强制刷新markerInfoWindow的内容

时间:2013-06-27 11:47:30

标签: google-maps-markers google-maps-sdk-ios gmsmapview

我正在返回UIImageView in - (UIView *)mapView:(GMSMapView *)mapView markerInfoWindow:(GMSMarker *)marker;

UIImageView使用SDWebImage通过网址动态加载图片。

正如文档中描述的标记信息窗口:

  

注意:每次在地图上显示信息窗口时,信息窗口都会呈现为图像。这意味着在其属性处于活动状态时对其属性的任何更改都不会立即可见。信息窗口的内容将在下次显示时刷新。

重点是,在下载图像后,信息窗口不会刷新并继续显示占位符图像,直到用户隐藏,然后再显示它。

所以我需要强制刷新下载图像块中markerInfoWindow的内容..

6 个答案:

答案 0 :(得分:21)

在GoogleMaps iOS SDK 1.13.0及更高版本中,他们添加了此功能。要启用此功能,只需将tracksInfoWindowChanges上的GMSMarker属性设置为YES

示例:

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

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

来源:

答案 1 :(得分:6)

这是我使用下面的解决方法解决问题的方法:

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 :(得分:3)

根据您的解释,我了解您希望在下载图像后刷新当前显示的信息窗口,以便使用新的详细信息重新绘制信息窗口。

您可以执行以下步骤:

1,Programatically close the infowindow

2,Programatically show the infowindow再次使用相同的标记

答案 3 :(得分:0)

@Shady Elyaski的答案很棒,这是对Parse的快速重新解释,因为任何人都需要一个人。

    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
                            }
                    }
                }
            }

答案 4 :(得分:0)

你有。只需几行简单的代码。这项工作非常适合我。完成下载图像后立即添加这些代码行 我的意思是在你的完成时。

     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
              }
            }

然后它的工作非常令人敬畏。内容立即重新加载新图像 基本上你仍然需要为你的marker.image分配新的图像,以便在你的" markerInfoContents"方法

答案 5 :(得分:0)

Swift 基于Enrico Susatyo解决方案:

将GMSMarker对象的 tracksInfoWindowChanges 属性设置为true

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