如何在 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 中的地图视图添加标记
iOS 中使用 nativescript-google-maps-sdk 的地图中心错误
适用于 iOS 的 Google Maps SDK - 折线