我遇到一个问题,在 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()
}
最佳答案
这显然是一个 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/