缓存的瓷砖没有显示 - Mapbox IOS SDK

时间:2014-11-06 17:16:59

标签: ios swift caching maps mapbox

我对iOS编程很新,我正在使用Swift for iOS8构建我的应用程序,并且还实现了Mapbox-ios-sdk,因为我希望我的用户能够下载离线地图区域。

我已经能够在缓存中下载离线地图区域,但是当我关闭Wifi和蜂窝数据时似乎没有访问缓存。地图瓷砖没有出现。只显示自动缓存的地图图块。

我看到正在下载磁贴(RMTileCache.db正在增长,正在调用RMTileCacheBackgroundDelegate方法didBeginBackgroundCacheWithCount,didBackgroundCacheTile和tileCacheDidFinishBackgroundCache),当直接查看db文件时,我也看到已经下载了正确的磁贴。

但是,当我关闭Wifi和Cellular数据时,地图图块不会加载到屏幕上。我已尝试添加其他RMDatabase缓存等几个选项,但似乎没有任何效果。我希望有人遇到同样的问题,可以帮助我。

我的代码大致基于此篇文章:http://mapbox.com/mapbox-ios-sdk/#tile_caching__class

班级相关变量:

var tileSource: RMMapboxSource = RMMapboxSource()
@IBOutlet var mapView: RMMapView!

viewDidLoad中:

    override func viewDidLoad() {
    super.viewDidLoad()

    let fullPath: String = NSBundle.mainBundle().pathForResource("mapbox", ofType: "json")!
    var errorInFullPath:NSErrorPointer? = NSErrorPointer()
    let tileJSON: String? = String(contentsOfFile: fullPath, encoding:NSUTF8StringEncoding, error: errorInFullPath!)
    tileSource = RMMapboxSource(tileJSON: tileJSON)

    initializeMap()

}

地图初始化:

func initializeMap() {
    mapView = RMMapView(frame: self.view.bounds)
    mapView.tileSource = tileSource
    tileSource.cacheable = true
    mapView.adjustTilesForRetinaDisplay = true
    mapView.userInteractionEnabled = true
    mapView.zoom = 9
    self.view.addSubview(mapView)
    mapView.delegate = self
}

下载操作:

func startDownload() {
    mapView.tileCache.backgroundCacheDelegate = self
    mapView.tileCache.beginBackgroundCacheForTileSource(tileSource, southWest: sw, northEast: ne, minZoom: 1, maxZoom: zoomLevel)
}

sw,ne和zoomLevel已在代码的其他地方定义,当我在beginBackgroundCacheForTileSource命令之前打印出来时,它们的值很好。

我不确定我在这里做错了什么。可能是一些非常愚蠢的东西,但我现在已经试图找到它2天了。希望有人可以帮助我。

提前致谢!

2 个答案:

答案 0 :(得分:4)

好的,所以我得到了它的工作,感谢incanus的尖端。事实证明,这是两个问题,这使得分析和找到根本原因变得更加困难。

第一个问题确实是我在viewDidLoad中进行了一些布局,它以某种方式阻止了加载兑现的地图图块。

第二个问题是我下载的区域与我认为下载的区域略有不同。所以我只需要调整我正在使用的RMMapView的pixelToCoordinate方法来实现这一点。

对于那些你感兴趣的人。我创建了一个单独的干净swift文件,没有任何布局,只是为了跟进Incanus'评论。这对我有用!

感谢Incanus。希望其他人也会觉得这个也很有用。

import UIKit

class ViewOfflineMapAreaViewController: UIViewController, RMMapViewDelegate {

var tileSource: RMMapboxSource = RMMapboxSource()
@IBOutlet var mapView: RMMapView!

override func viewDidLoad() {
    super.viewDidLoad()

    let fullPath: String = NSBundle.mainBundle().pathForResource("mapbox", ofType: "json")!
    var errorInFullPath:NSErrorPointer? = NSErrorPointer()
    let tileJSON: String? = String(contentsOfFile: fullPath, encoding:NSUTF8StringEncoding, error: errorInFullPath!)
    tileSource = RMMapboxSource(tileJSON: tileJSON)
    tileSource.retryCount = 3
    initializeMap()
}

override func didReceiveMemoryWarning() {
    super.didReceiveMemoryWarning()
}

func initializeMap() {
    mapView = RMMapView(frame: self.view.bounds)
    mapView.tileSource = tileSource
    tileSource.cacheable = true
    mapView.adjustTilesForRetinaDisplay = true
    mapView.userInteractionEnabled = true
    mapView.zoom = 9
    mapView.delegate = self


    //These two lines are just to resize the mapView upon device rotation   
    mapView.setTranslatesAutoresizingMaskIntoConstraints(true)
    mapView.autoresizingMask = UIViewAutoresizing.FlexibleHeight | UIViewAutoresizing.FlexibleWidth
}

override func viewDidAppear(animated: Bool) {
    self.view.addSubview(mapView)
}

}

答案 1 :(得分:0)

您正在本地保存TileJSON并将其用于实例化,这在您脱机操作时是必需的。但我认为您的问题可能是在-viewDidLoad期间进行布局。请在-viewWillAppear:或更晚版本中尝试此操作,我认为您会看到不同的结果。