iOS 13.2 移除 MapKit 中的叠加层导致地图闪烁。

7
我在我的应用程序中使用mapKit,其中有多个函数使用覆盖层图形渲染。现在,在iOS 13.2更新后,当我移动地图时(使用任何方法),会导致删除单个覆盖并在地图移动时重新绘制覆盖的函数使地图中的所有图形闪烁,就像它们都被重新绘制一样。移动地图的其中一种方法是通过locationManager的'didUpdateLocations'。
我无法发布代码,因为代码分成许多不同组合中调用的子函数。但我已经尝试了许多种验证方式,以验证仅从添加或删除叠加层的单个操作即可使图形闪烁。我也评估了要添加或删除的覆盖物,以验证它只是一个小的图形(MKPolyline)-而不是地图上的图形/覆盖物集。
因此,基本上,addOverlay函数似乎存在问题-重新绘制所有覆盖物...或类似于此类的事情。 是否还有其他人遇到iOS 13.2的这个问题?

更新:我注意到闪烁的图形只是最靠近地图中心的图形(我的单个图形正在被重新绘制)。更奇怪的是,有些闪烁只发生在一条线图形的一半上。这表明它与操作系统或MapKit有关,因为我的应用程序每次绘制时都会重新绘制整条线。 - Aroniousness
在我的情况下,我删除的覆盖层边界框下面的瓷砖会闪烁。 我有一行标题每秒更新一次,由于MKPolyline无法更新坐标,因此删除并添加新的是唯一的选择。 - Zifigo
1
我有同样的问题 - 在应用商店中稳定运行多年的应用程序使用MKPolygons。iOS 13.1没有任何闪烁,但是在添加和删除多边形时,iOS 13.2会出现严重的闪烁。这是一个新的MapKit问题。也许有一种更新地图的新程序? - azcoastal
我们难道不能更新 Shape 或 Renderer,而要把它删除然后再重新添加吗?因为我也遇到了同样的问题。 - Anirudha Mahale
6个回答

4
我也遇到了类似的问题。我的应用程序已经几个月没有更改了,但当我升级到iOS 13.2时,它开始出现问题。该应用程序具有一个地图视图,可以呈现MKTileOverlays。中心蓝点周围的2x2网格以每秒一次的速率不断闪烁,在所有缩放级别下都是如此。我能够在闪烁时(在iPhone上)捕捉屏幕,并且我可以看到它显示了一些更高缩放级别的图块。在下面的图片中,地图处于缩放级别14。我用绿色勾勒出了2x2闪烁的图块。当它闪烁时,会出现几个缩放级别为16(用橙色勾勒出)和缩放级别为17(用紫色勾勒出)的图块。只有在先前在这些区域缩放到该级别时,更高缩放级别的图块才会出现。否则,2x2闪烁的网格为空。

enter image description here

更新:

这是我于2019年12月5日收到的苹果开发技术支持部门的回复...

你所看到的是MapKit中已知的一个bug。我想传递一些额外的信息,帮助减少在你的真实应用程序中看到这种情况的频率。一些应用程序在MKMapView使用中常见的模式是频繁更新它们的覆盖层,例如一次性删除所有覆盖层,然后添加其中一些子集(或全部)。特别是如果这是针对用户驱动事件的热代码路径,如缩放地图和放大地图,则会加剧闪烁的瓷砖行为。在P. Stern提供的示例中,这是位置管理器的位置更新,在某些情况下可以以60赫兹的速度调用。您可以进行距离比较,并仅在自上次替换折线以来坐标发生足够大的变化时才更新折线,以便对于您的轨迹用例对用户有意义。将此应用于您的真实应用程序,请审核添加和删除覆盖层的点,并尝试减少调用这些方法的次数。这不会消除瓷砖闪烁问题,但可能会减少其频率,以缓解我们问题的影响。在查看覆盖层时,还要考虑为什么需要将覆盖层添加和删除到地图上,以及是否有机会以批量方式执行此操作,但很少这样做。我经常看到的另一个常见模式是尝试跟踪覆盖层以使内存使用量降低,并不断更新添加到地图上的覆盖层,以仅反映与用户位置或可见地图矩形相关的内容。但是,MKOverlay对象本身通常不大,因为它们只是一个坐标和一些数据,因此通过这些技术节省的内存通常在千字节到低兆字节范围内,这在地图需要100 MB的应用程序中并没有太大的改进,更不用说应用程序的其余数据和视图控制器了。

最终更新:

苹果已经解决了这个问题。我正在使用iOS 13.7(Xcode 12),不再出现闪烁现象。可能在iOS 13.4中已经修复,正如Zifigo所指出的那样。


1
更新:我已经缩小了问题的范围,但仍然没有解决方案。就像其他评论者注意到的那样,在我附近的蓝点附近删除和添加覆盖时会出现闪烁。覆盖是一个MKPolyline,它跟踪手机移动的位置。由于MKPolyline是只读的,当位置更新时,我必须将其删除并添加一个新的。 - P. Stern
有任何进展吗?尝试使用“exchangeOverlays”进行操作,但到目前为止没有成功... :F - raistlin
2
我已经打开了一个技术支持事件(TSI)。我在收到回复后会发布苹果的答复。支持部门现在关闭,直到12月1日。 - P. Stern
@P.Stern,如果苹果已经回复了,请您发布他们的回复。 - imike
2
我已经收到了苹果的回复,并将其作为更新输入在上面。我会问问苹果是否有一个跟踪该问题的工单。 - P. Stern

2

我也遇到了同样的问题。从iOS13.2开始,添加覆盖层(任何类型,比如tileoverlay、polyline)都会导致所有覆盖层刷新闪烁。

因此,我将所有覆盖层添加到地图上,并更改渲染器的alpha值来隐藏/显示它们,这是一种临时解决方案。


1
你能展示一下你是如何解决这个问题的代码吗? - Anirudha Mahale

1
我在iOS 15中遇到了这个问题。 显然,这个解决方案并不理想,但它适用于我们的使用情况,并且可以防止闪烁。也许它会为其他人节省一些时间。
mapView.addOverlay(currentLine)
DispatchQueue.main.asyncAfter(deadline: .now() + .milliseconds(200)) {
    self.mapView.removeOverlay(newLine)
}

1
我发现了两个必要条件:
  1. 使用MKTileOverlay作为自定义瓦片
  2. 删除MKOverlay对象

1
iOS 13.4修复了我的应用程序的问题 - 终于!保留HTML。

0
添加叠加层会导致所有叠加层重新加载,从而引起闪烁。为了最小化闪烁,应尽量减少叠加层的添加次数。不要用新的叠加层替换旧的叠加层,而是实现一个叠加层渲染器,观察重要的叠加层属性,并在需要时重新绘制叠加层,使旧路径无效。

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