iOS 13.2 MKTileOverlay 偶尔不会渲染

标签 ios swift mapkit

我遇到一个问题,在 iOS 13.2(可能也来自 iOS 13)中,使用 MKTileOverlay 加载离线 map 瓦片偶尔会无法呈现,使瓦片空白,似乎MKTileOverlay 的子类完全没有问题,因为它在 iOS 12 及以下版本中运行良好。我有 2 个 MKTileOverlay 类(1 个添加网格和 1 个加载 map 图 block 文件,默认 MKTileOverlay),两者都无法使用默认 加载到那个空白图 block 上>MKTileOverlayRenderer,其他叠加层似乎没问题。

如果我转到主屏幕并返回应用程序,问题似乎会自行解决,导致磁贴重新加载。这是 iOS MapKit 本身的错误吗?有人对此有临时解决方案吗?谢谢。

添加叠加层的代码:

let overlay = MKTileOverlay(urlTemplate: urlTemplate)
overlay.canReplaceMapContent = true
overlay.maximumZ = 19
mapView.insertOverlay(overlay, at: 0, level: .aboveLabels)

渲染器:

func mapView(_ mapView: MKMapView, rendererFor overlay: MKOverlay) -> MKOverlayRenderer {
    if overlay is MKTileOverlay {
        let renderer = MKTileOverlayRenderer(tileOverlay: overlay as! MKTileOverlay)
        return renderer
    }

    return MKOverlayRenderer()
}

enter image description here

最佳答案

这显然是一个 MapKit 问题/错误。

自 2020 年 12 月 9 日起,我还开了一张反馈单。

这个问题的根源不是很确定。

MapKit 和特别是 MKTileOverlay 总是有/有一些像 PNG 24 位这样的“重”图 block 的问题。当 MKTileOverlay 使用 PNG(重图 block )时,图 block 有时会闪烁并且 map 会不断重新加载,尤其是在宽屏(iPad pro 等)上。

因此,由于 JPEG 图 block 通常比 PNG 更浅,因此 JPEG 可能是一种解决方法。

但是,这个新的 iOS 13.2+ 问题不一样!不渲染随机图 block 。如果您删除并重新添加 MKTileOverlay 或调用 MKTileOverlayRenderer 的 reloadData 方法,将呈现丢失的图 block ,并且它将是其他随机图 block 丢失的。

问题的真正解决方案是打开反馈票:https://feedbackassistant.apple.com

编辑:我刚刚尝试在非常简单的 MKTileOverlay 项目示例中用 85% JPEG 替换我的 8 位 PNG,我已经在我的票证中发送给 Apple。同样的问题...没有改善。

编辑 2:将 NSData 加载到 UIImage 然后使用 UIImageRepresentationJPEG 似乎可以解决问题……丑陋……

- (void)loadTileAtPath:(MKTileOverlayPath)path result:(void (^)(NSData * _Nullable, NSError * _Nullable))result
{
    NSString *tilePath = [self PATHForTilePath:path];
    NSData *data = nil;

    if (![[NSFileManager defaultManager] fileExistsAtPath:tilePath])
    {
        NSLog(@"Z%ld/%ld/%ld does not exist!", path.z, path.x, path.y);
    }
    else
    {
        NSLog(@"Z%ld/%ld/%ld exist", path.z, path.x, path.y);

        UIImage *image = [UIImage imageWithContentsOfFile:tilePath];
        data = UIImageJPEGRepresentation(image, 0.8);
        // Instead of: data = [NSData dataWithContentsOfFile:tilePath];

        if (data == nil)
        {
            NSLog(@"Error!!! Unable to read an existing file!");
        }
    }

    dispatch_async(dispatch_get_main_queue(), ^{
        result(data, nil);
    });
}

关于iOS 13.2 MKTileOverlay 偶尔不会渲染,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59525403/

相关文章:

ios - 代码/iOS : does Maps need to be switched on in Capabilities?

ios - 如何设置导航栏的返回项

ios - 如何将多个相同节点添加到 View 中?

ios - 在#selector 函数中传递数据

ios - swift 3 : URLSession/URLRequest Not Working

ios - 火力基地/swift : retrieve value data

iPhone MapKit 是否可以从一系列触摸中映射坐标?

iphone - 在 iOS 上收到通知时确定应用程序是否在前台运行

ios - 哪个 Cocoa Touch 集合可以存储 nil 值?

ios - 如何解决 XCode 中的链接器警告 "ignoring linker optimzation hint at"?