我在下面标记的点上收到运行时错误?如何从子类调用MKTileOverlay“url”函数?得到EXC_BAD_INSTRUCTION?
基本上想要在某些地方显示自定义图块,但是当不可用时会回退到标准的Apple地图图块。
class GCMapOverlay : MKTileOverlay {
override func url(forTilePath path: MKTileOverlayPath) -> URL {
// Get local custom map tile if available
let optionalUrl = Bundle.main.url(
forResource: "\(path.y)",
withExtension: "png",
subdirectory: "tiles/\(path.z)/\(path.x)",
localization: nil)
NSLog("tiles/\(path.z)/\(path.x)/\(path.y)")
guard let url = optionalUrl else {
// Local tile not available - want to drop back to an apple maps tile (as if MKTileOverlay wasn't subclassed)
return super.url(forTilePath: path) // <== RUNTIME ERROR: NetworkLoad (10): EXC_BAD_INSTRUCTION
}
// Local tile available so return
return url
}
}
在我的控制器中
func setupTileRenderer() {
let overlay = GCMapOverlay()
overlay.canReplaceMapContent = true
mapView.addOverlay(overlay, level: .aboveLabels)
tileRenderer = MKTileOverlayRenderer(tileOverlay: overlay)
}
删除overlay.canReplaceMapContent = true
并更改您的防护声明,以便加载一个清晰的256x256磁贴。
guard let url = optionalUrl else {
return Bundle.main.url(forResource: "emptyTile", withExtension: "png")!
}
由于所有自定义图块都已存储在本地,因此它们将立即加载到默认的Apple图块上,这使得canReplaceMapContent
不再需要。
确保您的自定义图块中没有alpha,否则Apple图块将在下方显示。
我从来没有使用过MKTileOverlay
,但url(forTilePath:)
的文档指出:
此方法的默认实现使用您在初始化时提供的模板字符串来构建指定tile图像的URL。
MKTileOverlay
类提供初始化程序:
init(urlTemplate:)
但是当您创建GCMapOverlay
的实例时,您不使用该初始化程序。
更换:
let overlay = GCMapOverlay()
有:
let overlay = GCMapOverlay(urlTemplate: someAppropriateTemplate)
或者覆盖子类中的urlTemplate
属性应该在调用super.url(forTilePath:)
时解决您的问题。