MKTileOverlay:如何重新加载特定的图块或区域
Posted
技术标签:
【中文标题】MKTileOverlay:如何重新加载特定的图块或区域【英文标题】:MKTileOverlay: How to reload a specific tile or region 【发布时间】:2016-06-28 16:17:50 【问题描述】:我正在开发一个基于地图的应用程序。我使用MKTileOverlay
来显示一些动态内容。有时,当新信息到达时,某些图块需要重新加载。
我尝试在主线程中调用overlayRenderer.setNeedsDisplayInMapRect(mapRect)
,但显然它不会触发我的地图重绘。到目前为止,唯一有效的方法是overlayRenderer.reloadData()
。但是,这会导致重新加载整个内容(而不仅仅是特定区域)并导致视图闪烁,所以这不是我的选择。
任何人都可以就此提供任何建议吗?谢谢和干杯。
【问题讨论】:
看看这是否有帮助:***.com/questions/10128447/… 谢谢,但是我尝试了这篇文章中提到的方法。它们都不适合我。 ?????? 【参考方案1】:我终于想通了。事实上,覆盖没有更新并不是因为setNeedsDisplayInMapRect
。经过几次检查后,我发现setNeedsDisplayInMapRect
实际上导致了drawMapRect:zoomScale:inContext:
的运行,但是,不知何故,默认重绘会产生相同的平铺图像。我猜这可能是由于 MKTileOverlayRender 的一些内部缓存。
我的解决方案是继承MKTileOverlayRender
,并在新类中:
override func canDrawMapRect(mapRect: MKMapRect, zoomScale: MKZoomScale) -> Bool
let tilePath = self.tilePathForMapRect(mapRect, andZoomScale: zoomScale)
let tilePathString = stringForTilePath(tilePath)
if let _ = self.cache.objectForKey(tilePathString)
return true
else
let tileOverlay = self.overlay as! MKTileOverlay
tileOverlay.loadTileAtPath(tilePath, result:
data, error in
if error == nil && data != nil
if let image = UIImage(data: data!)
self.cache.setObject(image, forKey: tilePathString)
self.setNeedsDisplayInMapRect(mapRect, zoomScale: zoomScale)
)
return false
override func drawMapRect(mapRect: MKMapRect, zoomScale: MKZoomScale, inContext context: CGContext)
let tilePath = self.tilePathForMapRect(mapRect, andZoomScale: zoomScale)
let tilePathString = stringForTilePath(tilePath)
if let image = self.cache.objectForKey(tilePathString) as? UIImage
CGContextDrawImage(context, self.rectForMapRect(mapRect), image.CGImage)
else
super.setNeedsDisplayInMapRect(mapRect, zoomScale: zoomScale)
self.cache.removeObjectForKey(tilePathString)
【讨论】:
以上是关于MKTileOverlay:如何重新加载特定的图块或区域的主要内容,如果未能解决你的问题,请参考以下文章
iOS 7 有没有办法知道 MKTileOverlay 何时完成加载图块?
带有 Retina-Tiles 的 MKTileOverlay