有没有办法在iOS 6中限制MKMapView缩放级别

时间:2013-05-06 21:18:49

标签: ios ipad ios6 mkmapview

在我的一个iPad应用程序中,我使用MKMapView来显示区域,我有一个奇怪的问题。我使用setRegion:animated:方法从noOf点设置特定区域。当我从地图中的特定点放大时,地图会显示没有地点/位置图像的网格。有没有人之前有同样的问题?有人可以为如何处理这个缩放级别问题提供解决方案吗?

附加图像以供参考

最初,我使用2d坐标调用mapview的setRegion:方法,并为纬度和经度增量值调用其跨度为0.0014f。所以我得到了以下图片。

enter image description here

之后,如果我再次尝试放大地图视图,则会出现如下情况

enter image description here

我担心的是,是否有办法限制放大以避免黑色图层显示/如何在mapview到达其最佳缩放细胞时限制放大。

3 个答案:

答案 0 :(得分:0)

当您放大CLOSE时,mapview想要显示最详细的图块,而不是其他。对于某些区域(政府,军队或没有任何东西的地方),没有瓷砖,它会遇到这种情况!

问题是你事先不知道哪里有或哪些瓷砖可用。

我能想象到的: 当你缩放。 调用regionWillChange:然后调用willStartLoading:,然后调用mapViewDidFailLoadingMap:withError

(我猜这里)

答案 1 :(得分:0)

Swift 中,您应该使用以下代码来定义最小和最大缩放限制

let MIN_ZOOM_LEVEL = 16.5
let MAX_ZOOM_LEVEL = 18.0

extension UIViewController: MKMapViewDelegate {
    func mapView(_ mapView: MKMapView, regionDidChangeAnimated animated: Bool) {
            let coordinate = CLLocationCoordinate2DMake(mapView.region.center.latitude, mapView.region.center.longitude)
            let zoomLevel = getZoomLevel()

            if MIN_ZOOM_LEVEL > zoomLevel || MAX_ZOOM_LEVEL < zoomLevel {
                let region = MKCoordinateRegionMake(coordinate, self.latestSpan)
                mapView.setRegion(region, animated:true)
            } else {
                self.latestSpan = MKCoordinateSpanMake(0, 360 / pow(2, Double(zoomLevel-1)) * Double(mapView.frame.size.width) / 256)
            }
    }
}


func getZoomLevel() -> Double {
        var angleCamera = mapView.camera.heading
        if angleCamera > 270 {
            angleCamera = 360 - angleCamera
        } else if angleCamera > 90 {
            angleCamera = fabs(angleCamera - 180)
        }
        let angleRad = M_PI * angleCamera / 180
        let width = Double(mapView.frame.size.width)
        let height = Double(mapView.frame.size.height)
        let heightOffset : Double = 20
        let spanStraight = width * mapView.region.span.longitudeDelta / (width * cos(angleRad) + (height - heightOffset) * sin(angleRad))
        return log2(360 * ((width / 256) / spanStraight)) + 1
}

答案 2 :(得分:-1)

//fix for ios6
if (region.span.latitudeDelta < .0005f)
    region.span.latitudeDelta = .0005f;
if (!region.span.longitudeDelta < .0005f)
    region.span.longitudeDelta = .0005f;

确保lat / lon的区域范围没有设置得太低,它会清空。

为了清晰起见进行编辑:在iOS6中,将跨度增量设置得太低(例如小于.0005)将导致它将地图视图字面设置为该区域,无论它是否具有该级别的图像的图块集细节。 IE:如果放大得太远,则没有地图图块来表示该区域。在iOS5中,它会处理尝试放大太远并剪切区域而不会引起问题。

要解决此问题,您可以将区域范围lat和lon delta设置为最小值,以便地图仍然显示自己。无论何时设置地图区域或使其发生变化,都要检查最小值。