gpt4 book ai didi

iOS 13.2 MKTileOverlay 偶尔不会渲染

转载 作者:行者123 更新时间:2023-12-01 15:57:22 28 4
gpt4 key购买 nike

我遇到一个问题,在 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/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com