我正在尝试更新我的磁贴地图代码,以使用iOS 7的MKTileOverlay和MKTileOverlayRenderer,我可以使用一些指针来让事情变得更好。
首先,下面是iOS6代码:AppleTileOverlay.m和TileOverlayView.m。当我用一个在所有方面都相同的类替换TileOverlayView时,这在iOS 7中仍然很好用,除了它是MKOverlayRenderer的子类而不是MKOverlayView的子类。
我正在测试的新代码是MKTileOverlay的一个子类,唯一的方法是:
-(NSURL *)URLForTilePath:(MKTileOverlayPath)path {
NSString *tileKey = [[NSString alloc] initWithFormat:@"%d%d%d", path.x, path.y, path.z];
NSString *tilePath = [[NSBundle mainBundle] pathForResource:tileKey ofType:nil inDirectory:@"TileFolder"];
NSURL *url;
if (tilePath) {
url = [NSURL fileURLWithPath:tilePath];
}
return url;
}大多数情况下,地图瓦片的加载都很正常,但日志中会填满如下消息:
Error loading URL (null): Error Domain=NSURLErrorDomain Code=-1000 "bad URL" UserInfo=0x1b3e19e0 {NSUnderlyingError=0x1894d470 "bad URL", NSLocalizedDescription=bad URL}来自为URL返回nil的方法。
所以问题是:我可以避免这些错误消息吗,或者我应该只使用我已经有的旧的overlay类?
发布于 2015-10-29 19:46:43
我认为在Swift 2.0中,URLForFilePath(...)不能返回nil,因为它不是可选的。
我设法解决了这个问题,使用MKTileOverlay子类检查有效的磁贴路径,如果磁贴图像不可用,则加载一个“虚拟的”透明磁贴。
override func URLForTilePath(path: MKTileOverlayPath) -> NSURL {
let tileKey = String(format:"%d/%d/%d",path.z,path.x,path.y)
let tilePath = NSBundle.mainBundle().pathForResource(tileKey, ofType: "png", inDirectory: "Maps/Map1880")
let blankTilePath = NSBundle.mainBundle().pathForResource("blank", ofType: "png", inDirectory: "Maps")
var url: NSURL
if ((tilePath) != nil)
{
url = NSURL.fileURLWithPath(tilePath!)
} else {
url = NSURL.fileURLWithPath(blankTilePath!)
}
return url;
}这不是很优雅,因为它为每个不是覆盖的一部分的瓷砖加载空白瓷砖。
然而,有一个更好的解决方案,感谢用户:苹果开发者论坛上的垃圾堆,试图加载不存在的overlay tiles的问题是,boundingMapRect默认设置为MKMapRectWorld,,即整个世界。
要将其限制为所需的叠加区域,请创建MKTileOverlay.子类
下面是一个例子:
import MapKit
class CustomTileOverlay : MKTileOverlay {
override var boundingMapRect: MKMapRect {
get {
//North-East Corner of region
let lat1 = 53.46075
let long1 = -1.92618
//South-West Corner of region
let lat2 = 53.43018
let long2 = -1.992885
//Convert to Coordinates
let coord1 = CLLocationCoordinate2DMake(lat1,long1)
let coord2 = CLLocationCoordinate2DMake(lat2,long2)
//Convert to map points
let p1 = MKMapPointForCoordinate (coord1);
let p2 = MKMapPointForCoordinate (coord2);
//Return the MKMapRect
return MKMapRectMake(fmin(p1.x,p2.x), fmin(p1.y,p2.y), fabs(p1.x-p2.x), fabs(p1.y-p2.y));
}
}
}发布于 2013-10-18 01:02:53
我的猜测是,尽管没有一个真正有效的tilePath,但您总是在尝试设置url。添加一些调试并查看。
发布于 2013-10-18 04:53:26
当您查看地图上没有磁贴的区域时,会发生这种情况吗?
因为要检查文件是否存在,如果文件不存在,则不设置url,因此返回nil。您应该将有效的NSURL返回给透明图像。
https://stackoverflow.com/questions/19409942
复制相似问题