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

OpenLayers 3:重新加载失败的图块

CATiledLayer:如何导致仅重新加载一些图块?

MapKit:添加 MKPolyline 隐藏 MKTileOverlay

iOS 13.2 MKTileOverlay 偶尔不会渲染