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

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

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

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

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

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

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

【问题讨论】:

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


    【解决方案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;
    }
    

    来源:

    【讨论】:

    • 为什么他们花了 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) {
    
            }];
        }
    

    【讨论】:

    【解决方案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”方法中使用它

          【讨论】:

            猜你喜欢
            • 1970-01-01
            • 1970-01-01
            • 2010-11-24
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 2013-11-03
            • 1970-01-01
            • 1970-01-01
            相关资源
            最近更新 更多