【问题标题】:iOS 13.2 removing overlay from MapKit causing map to flickeriOS 13.2 从 MapKit 中删除覆盖导致地图闪烁
【发布时间】:2020-02-28 16:06:15
【问题描述】:

我在我的应用程序中使用了 mapKit,并且我有几个使用叠加层渲染图形的函数。 现在,随着 iOS 13.2 的更新,当我移动地图(使用任何方法)时,删除单个叠加层并在地图移动时重绘叠加层的功能 - 导致地图中的所有图形闪烁 - 就好像它们都被重绘一样。 移动地图的方法之一是 locationManager 的“didUpdateLocations”。

我不能发布代码,因为代码被拆分为许多子函数,所有这些子函数都以不同的组合调用。 但是我已经测试了许多方法来验证图形是否仅通过添加或删除覆盖的单个操作而闪烁。我已经评估了添加或删除的叠加层,以验证它只是一个小图形 (MKPolyline),而不是地图上的一组图形/叠加层。

所以基本上,addOverlay 函数似乎有问题 - 重绘所有叠加层......,或类似的东西......

还有其他人在使用 iOS13.2 时遇到此问题吗?

【问题讨论】:

  • 更新:我注意到闪烁的图形只是最靠近地图中心的图形(我的单个图形正在重绘)。更奇怪的是;一些闪烁仅发生在线条图形的一半上。从而暗示它与 OS 或 mapKit 相关,因为我的应用程序会在任何时候重新绘制整条线。
  • 在我的情况下,我删除的叠加层边界框下方的图块正在闪烁。我有一条标题线每秒更新一次,并且 MKPolyline 无法更新坐标,删除和添加新坐标是唯一的选择。
  • 我有同样的问题 - 使用 MKPolygons 在应用商店中稳定应用多年。 iOS 13.1 工作时没有任何闪烁,iOS 13.2 在添加和删除多边形时有严重的闪烁。这是一个新的 MapKit 问题。也许有更新地图的新程序?
  • 我们不能更新形状或渲染器而不是删除并添加回来吗?因为我也面临同样的问题。

标签: swift mapkit overlay ios13


【解决方案1】:

类似的事情发生在我身上。我有一个应用程序几个月没有改变,但是当我升级到 iOS 13.2 时,它开始出现异常。该应用程序有一个渲染 MKTileOverlays 的 mapView。在所有缩放级别,围绕中心蓝点的 2x2 网格以每秒一次的速率连续闪烁。我能够在屏幕闪烁时(在 iPhone 上)捕获它,并且我可以看到它以更高的缩放级别显示了许多图块。

在下图中,地图的缩放级别为 14。我用绿色勾勒出 2x2 闪烁的图块。当它闪烁时,会出现几个缩放级别为 16(橙色轮廓)和缩放级别 17(紫色轮廓)的图块。

仅当我之前在这些区域中放大到该级别时,才会显示更高缩放级别的图块。否则,2x2 闪烁的网格为空。

更新:

这是我在 2019 年 12 月 5 日从 Apple 开发者技术支持收到的回复...

您看到的是 MapKit 中的一个已知错误。我想传递一些额外的信息,以帮助减少您在实际应用中看到这种情况的频率。一些应用程序在 MKMapView 使用中使用的一种常见模式是对其覆盖层进行频繁更新,例如一次删除所有覆盖层,然后将它们的一些子集(或全部)添加回来。特别是,如果对用户驱动事件的热代码路径执行此操作,例如捏合和缩放地图,则会加剧闪烁的图块行为。

在示例 [由 P. Stern 提供] 的情况下,这是位置管理器的位置更新,在某些情况下可以以 60 赫兹的频率调用。您可以执行距离比较之类的操作,并且仅当自上次替换折线以对用户对您的跟踪用例有意义时坐标发生足够显着的变化时才更新折线。将此应用于您的实际应用程序,请审核您添加和删除叠加层的点,并尝试减少调用这些方法的次数。这不会消除磁贴闪烁问题,但可能会降低其频率,以减轻我们问题的影响。

查看叠加层时,还要考虑为什么需要在地图中添加和删除叠加层,以及是否有机会批量这样做,但很少这样做。我经常看到的另一种常见模式是尝试跟踪叠加层以降低内存使用率,并不断更新添加到地图中的叠加层以仅反映与用户位置或可见地图矩形相关的叠加层。然而,MKOverlay 对象本身通常并不大,因为它们只是一个坐标和一点数据,所以这些技术节省的内存通常在千字节到低兆字节范围内,这对于应用程序来说并没有太大的改进。仅地图就需要 100 MB,更不用说应用程序的其余数据和视图控制器了。

最终更新:

该问题似乎已由 Apple 解决。我正在使用 iOS 13.7 (Xcode 12) 并且不再出现闪烁。正如 Zifigo 所指出的,它可能已在 iOS 13.4 中修复。

【讨论】:

  • 更新:我缩小了原因,但仍然没有解决方案。就像其他评论者注意到的那样,当我删除并在蓝点附近添加一个覆盖时,会发生闪烁。叠加层是一个 MKPolyline,可在手机移动时跟踪手机的位置。由于 MKPolyline 是只读的,因此我必须在位置更新时将其删除并添加一个新的。
  • 成功了吗?尝试与exchangeOverlays 一起玩,但到目前为止没有运气......:F
  • 我打开了一个技术支持事件 (TSI)。当我得到它时,我会发布苹果的回复。支持现已关闭,直到 12 月 1 日。
  • @P.Stern 如果 Apple 已经回答,请您发布回复
  • 我收到了 Apple 的回复,并将其作为更新输入,如上。我会问苹果是否有票可以跟踪问题。
【解决方案2】:

添加叠加层会导致所有叠加层重新加载,从而导致闪烁。要尽量减少闪烁,请尽量减少叠加添加的数量。不要用新的覆盖层替换,而是实现一个覆盖层渲染器,它观察重要的覆盖层属性并在需要时重绘覆盖层,使旧路径无效。

【讨论】:

    【解决方案3】:

    iOS 13.4 终于为我的应用解决了这个问题!

    【讨论】:

      【解决方案4】:

      我找到了两个必要条件

      1. 使用 MKTileOverlay 作为自定义图块
      2. 移除 MKOverlay 对象

      【讨论】:

        【解决方案5】:

        同样的事情发生在我身上。从 iOS13.2 开始,添加叠加层(任何类型,如 tileoverlay、折线)都会导致所有叠加层刷新、闪烁。

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

        【讨论】:

        • 你能展示一些你是如何解决这个问题的代码吗?
        猜你喜欢
        • 2014-04-06
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2015-08-28
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多