首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >自定义缓存切片的MKTileOverlay

自定义缓存切片的MKTileOverlay
EN

Stack Overflow用户
提问于 2013-10-17 01:30:16
回答 4查看 3.4K关注 0票数 3

我正在尝试更新我的磁贴地图代码,以使用iOS 7的MKTileOverlayMKTileOverlayRenderer,我可以使用一些指针来让事情变得更好。

首先,下面是iOS6代码:AppleTileOverlay.mTileOverlayView.m。当我用一个在所有方面都相同的类替换TileOverlayView时,这在iOS 7中仍然很好用,除了它是MKOverlayRenderer的子类而不是MKOverlayView的子类。

我正在测试的新代码是MKTileOverlay的一个子类,唯一的方法是:

代码语言:javascript
复制
-(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;
}

大多数情况下,地图瓦片的加载都很正常,但日志中会填满如下消息:

代码语言:javascript
复制
Error loading URL (null): Error Domain=NSURLErrorDomain Code=-1000 "bad URL" UserInfo=0x1b3e19e0 {NSUnderlyingError=0x1894d470 "bad URL", NSLocalizedDescription=bad URL}

来自为URL返回nil的方法。

所以问题是:我可以避免这些错误消息吗,或者我应该只使用我已经有的旧的overlay类?

EN

回答 4

Stack Overflow用户

发布于 2015-10-29 19:46:43

我认为在Swift 2.0中,URLForFilePath(...)不能返回nil,因为它不是可选的。

我设法解决了这个问题,使用MKTileOverlay子类检查有效的磁贴路径,如果磁贴图像不可用,则加载一个“虚拟的”透明磁贴。

代码语言:javascript
复制
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.子类

下面是一个例子:

代码语言:javascript
复制
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)); 
            }
        }
    }
票数 1
EN

Stack Overflow用户

发布于 2013-10-18 01:02:53

我的猜测是,尽管没有一个真正有效的tilePath,但您总是在尝试设置url。添加一些调试并查看。

票数 0
EN

Stack Overflow用户

发布于 2013-10-18 04:53:26

当您查看地图上没有磁贴的区域时,会发生这种情况吗?

因为要检查文件是否存在,如果文件不存在,则不设置url,因此返回nil。您应该将有效的NSURL返回给透明图像。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/19409942

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档