子类化 MKTileOverlay 的困难

Posted

技术标签:

【中文标题】子类化 MKTileOverlay 的困难【英文标题】:Difficulty In Subclassing MKTileOverlay 【发布时间】:2016-08-09 19:06:08 【问题描述】:

我正在尝试对 MKTileOverlay 进行子类化,但是遇到了问题,它没有在对象上找到属性 canReplaceMap。我究竟做错了什么?我去新建,创建新类,MKTileOverlay 的子类并添加教程都说要添加的方法,但是找不到这些简单的属性!

【问题讨论】:

您能否发布代码 sn-p,说明您如何对 MKTileOverlay 进行子类化以及如何访问其上的 canReplaceMap 属性? 【参考方案1】:

这是我一直用来在 MapKit 中覆盖地图的 MKTileOverlay 的自定义类扩展:

class CustomTileOverlay : MKTileOverlay

    var mapLocation: MKMapPoint
    var mapSize: MKMapSize

    init(urlTemplate: String, location: MKMapPoint, size: MKMapSize)
    
        mapLocation = location
        mapSize = size

        super.init(urlTemplate: urlTemplate)
    

    override var boundingMapRect: MKMapRect 
        get 
            return MKMapRect(origin: mapLocation, size: mapSize)
        
    

进行扩展的原因是能够调整boundingMapRect,因为它在基类中是只读的(所以如果你不需要调整它,不要子类MKTileOverlay)。

这是使用自定义类的设置。我从为磁贴集设置的 CoreData 记录中提取值,但您可以硬连线这些值或从适合您的应用程序的任何位置获取它们。因为我有覆盖瓷砖的折线,所以我需要最后一行来确保瓷砖在线条下方,所以如果你没有这两条线,你就不需要那条线。

    [Declaration...]

    private var tileLayer: CustomTileOverlay?

    [Later in the code...]

    let rectangle = overlayMap.getMapRectangle()  // Why I need to sub-class
    let mapURL = "file://" + overlayMap.getMapPath() + "/z/x/y.png"
    tileLayer = CustomTileOverlay(urlTemplate: mapURL, location: rectangle.origin, size: rectangle.size)
    tileLayer?.minimumZ = overlayMap.getMinimumZoom()
    tileLayer?.maximumZ = overlayMap.getMaximumZoom()
    tileLayer?.canReplaceMapContent = true
    tileLayer?.tileSize = overlayMap.getTileSize()
    self.mapView.add(tileLayer!)
    self.mapView.insert(tileLayer!, at: 0)  // Set to lowest z-level to ensure polylines are above map tiles

【讨论】:

以上是关于子类化 MKTileOverlay 的困难的主要内容,如果未能解决你的问题,请参考以下文章

缓存切片的 MKTileOverlay 子类

iOS 13.2 MKTileOverlay 偶尔不会渲染

子类化 UIAlertController 并遇到运行时错误

iOS 中的离线地图

将 MKTileOverlay 与 MKPolyLine 一起使用

带有 MTiles 数据库的 MKTileOverlay