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

Posted

技术标签:

【中文标题】如何在 Google Maps iOS SDK 中强制刷新 markerInfoWindow 的内容【英文标题】:How to force refresh contents of the markerInfoWindow in Google Maps iOS SDK 【发布时间】:2013-06-24 21:44:00 【问题描述】:

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

这个UIImageView 使用SDWebImage 通过 URL 动态加载图像。

正如文档中所说的标记信息窗口:

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

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

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

【问题讨论】:

【参考方案1】:

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

例子:

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

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

来源:

https://code.google.com/p/gmaps-api-issues/issues/detail?id=5559 https://developers.google.com/maps/documentation/ios-sdk/releases#version_1131_-_may_02_2016

【讨论】:

为什么他们花了 3 年时间才提出建议?太吓人了【参考方案2】:

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

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) 

        ];
    

【讨论】:

这个答案不再正确,请参阅下面@Enrico Susatyo 的答案 (***.com/a/37064936/1305067)。【参考方案3】:

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

您可以执行以下步骤:

1,Programatically close the infowindow

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

【讨论】:

【参考方案4】:

Swift 基于 Enrico Susatyo 解决方案:

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

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

【讨论】:

【参考方案5】:

@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
                            
                    
                
            

【讨论】:

【参考方案6】:

你来了。只需几行简单的代码。这对我来说很完美。完成下载图像后立即添加这些代码行 我的意思是在您的 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
              
            

然后它的效果真是太棒了。内容立即用新图像重新加载 基本上,您仍然必须将新图像分配给您的 marker.image 以在您的“markerInfoContents”方法中使用它

【讨论】:

以上是关于如何在 Google Maps iOS SDK 中强制刷新 markerInfoWindow 的内容的主要内容,如果未能解决你的问题,请参考以下文章

如何在 swift 中为 ios 的 google maps sdk 中的地图视图添加标记

Google Maps iOS SDK 上只有一个标记

iOS 中使用 nativescript-google-maps-sdk 的地图中心错误

适用于 iOS 的 Google Maps SDK - 折线

Google Maps SDK iOS - 根据缩放级别计算半径

IOS中带有语音导航方向的Google Maps sdk?