我对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天了。希望有人可以帮助我。
提前致谢!
答案 0 :(得分:4)
第一个问题确实是我在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:
或更晚版本中尝试此操作,我认为您会看到不同的结果。