子类化MKTileOverlay的难度

时间:2016-08-09 19:06:08

标签: ios mktileoverlay

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

1 个答案:

答案 0 :(得分:1)

以下是MKTileOverlay的自定义类扩展,我一直用它来覆盖MapKit中的地图:

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,因为它只能在基类中读取(因此,如果您不需要调整它,请不要class 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