• 设为首页
  • 点击收藏
  • 手机版
    手机扫一扫访问
    迪恩网络手机版
  • 关注官方公众号
    微信扫一扫关注
    公众号

ios - MKTileOverlay:如何重新加载特定的图 block 或区域

[复制链接]
菜鸟教程小白 发表于 2022-12-12 20:57:16 | 显示全部楼层 |阅读模式 打印 上一主题 下一主题

我正在开发一个基于 map 的应用程序。我使用 MKTileOverlay 来显示一些动态内容。有时,当新信息到达时,某些图 block 需要重新加载。

我尝试在主线程中调用 overlayRenderer.setNeedsDisplayInMapRect(mapRect) 但显然在我的情况下它不会触发 map 重绘。到目前为止,唯一可行的方法是 overlayRenderer.reloadData()。但是,这将导致重新加载整个内容(而不仅仅是特定区域)并导致 View 闪烁,所以这不是我的选择。

任何人都可以就此提供任何建议吗?谢谢和干杯。



Best Answer-推荐答案


我终于想通了。事实上,叠加层没有更新并不是由于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)
}

关于ios - MKTileOverlay:如何重新加载特定的图 block 或区域,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38081372/

回复

使用道具 举报

懒得打字嘛,点击右侧快捷回复 【右侧内容,后台自定义】
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

关注0

粉丝2

帖子830918

发布主题
阅读排行 更多
广告位

扫描微信二维码

查看手机版网站

随时了解更新最新资讯

139-2527-9053

在线客服(服务时间 9:00~18:00)

在线QQ客服
地址:深圳市南山区西丽大学城创智工业园
电邮:jeky_zhao#qq.com
移动电话:139-2527-9053

Powered by 互联科技 X3.4© 2001-2213 极客世界.|Sitemap