在我的一个iPad应用程序中,我使用MKMapView来显示区域,我有一个奇怪的问题。我使用setRegion:animated:方法从noOf点设置特定区域。当我从地图中的特定点放大时,地图会显示没有地点/位置图像的网格。有没有人之前有同样的问题?有人可以为如何处理这个缩放级别问题提供解决方案吗?
附加图像以供参考
最初,我使用2d坐标调用mapview的setRegion:方法,并为纬度和经度增量值调用其跨度为0.0014f。所以我得到了以下图片。
之后,如果我再次尝试放大地图视图,则会出现如下情况
我担心的是,是否有办法限制放大以避免黑色图层显示/如何在mapview到达其最佳缩放细胞时限制放大。
答案 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设置为最小值,以便地图仍然显示自己。无论何时设置地图区域或使其发生变化,都要检查最小值。