iOS - 自定义MKTileOverlay中某些瓦片没有被渲染

8

我在我的iOS项目中使用MapKit创建了一个自定义的MKTileOverlay,大部分时间都可以正常工作。然而,在缩放几次和移动地图后,有些瓦片没有被绘制出来。

起初,我以为这是简单的瓦片未加载,所以我创建了一个MKTileOverlay子类,并在控制台中添加了日志记录。它显示所有瓦片都已经完美地加载并交付给结果块。

当我没有更多的想法时,我创建了一个本地瓦片生成器,它只返回带有它们的路径x/y/z和框架绘制的图像,以查看缺少哪些瓦片。

缺失的瓦片示例图片

不幸的是,即使使用本地生成的瓦片,问题仍然存在,因此与互联网连接无关。另一个奇怪的行为是,如果我在彼此上面有两个自定义图层,那么将完全相同的瓦片未被渲染在两个覆盖层上。

我现在唯一能想到的解决办法是创建一个瓦片渲染器的子类,并确保一切都显示出来,因为没有办法知道瓦片是否已被渲染。然而,这听起来像是一项很大的工作和“重复造轮子”的任务...


你找到解决方案了吗?我认为这是由于用户已经缩放超过了你的覆盖层的maximumZ所致。当发生这种情况时,MapKit不再从此覆盖层请求瓦片;因此,当用户在超过maximumZ的缩放级别上四处移动并到达以前未呈现的瓦片时,MapKit不会请求它,因此显示一个空白瓦片。请查看以下内容:https://dev59.com/1VLTa4cB1Zd3GeqPaGQ3 https://dev59.com/PW855IYBdhLWcg3wUCeC - Constantine
1
不幸的是,我认为这与缩放无关。它在最小/最大范围内的许多不同缩放级别下发生。我的朋友参加了2017年WWDC并在某个研讨会上提出了这个问题。苹果工程师填写了一个错误报告,现在我们希望它能够随着iOS 11一起得到修复。 - pppd
1
我可以在我的项目中重现它,但只有在缩放超过maximumZ级别时才能出现。@pppd,你有这个错误报告的参考吗? - Constantine
有相同的问题,有人找到解决方法了吗?我只在180.0/0.0的边界处看到这个问题...但在每个缩放级别上都会出现。 - Hardy_Germany
1个回答

1

我们也遇到了缺失地图瓦片的问题-试图在新西兰周围绘制地图瓦片。MKOverlayRenderer甚至都没有请求这些瓦片。我们陷入了思考,认为这可能是因为新西兰接近180/0纬度边界导致的。不是这个原因。而是因为子类方法:

- (void)loadTileAtPath:(MKTileOverlayPath)path result:(void (^)(NSData * __nullable data, NSError * __nullable error))result;

即使没有数据返回,也必须始终调用结果方法!为了归功于解决方案的来源,这是我们的解决方案源:

MKTileOverlay未绘制每个图块?


谢谢您的回答,真希望我早5小时就找到了它! - Jordi Bruin
2
在我们的情况下,这并没有帮助。我的示例代码生成人工瓷砖,因此总是有数据返回,但其中一些不会被渲染。 - pppd
与@pppd一样,这对我们没有帮助。有些平铺砖块无法按照我所提供的赏金描述进行渲染,但当我们被调用时,我们总是使用有效且非空的数据调用结果块。 - RobP
我们在2017年WWDC期间向苹果报告了这个问题,并提供了一个最小的样例应用程序来重现它,但据我所知它仍然存在。 - pppd
@pppd 这个问题还存在吗?我刚刚提了一个问题,想知道我是否遇到了你遇到的同样的 bug?尽管我无法渲染任何瓦片。https://stackoverflow.com/questions/62824057/local-tiles-stored-in-sqlite-db-not-rendering-on-loadtileat-pathresult - Turnipdabeets

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接