我很熟悉使用谷歌地图JavaScript API版本。 最近,我开始使用MapKit框架的一个iphone的项目,但我有一个很难弄清楚变焦和地图设置的区域。
在谷歌地图API我以前一起简单的功能setZoom()使用整数缩放级别像8,9,10。 唯一的等效方法,我可以在MapKit框架看到的是setRegion:动画。 据我所知,我需要设置一个区域跨度纬度和经度“三角”值,以指定的缩放级别。 但我真的没有一个想法是什么,这些值代表(我读的文档)。
当我使用的MKMapView委托和跟踪在regionDidChange委托方法结果的跨度值似乎并不相互关联。 当我缩小,看到了跨度为文档指定的增量值增加它的确定。 但我突然拖动地图,而缩放和增量值变为0.0,。
可有人请解释什么是基准点到这些跨度和增量? 或者是有任何的算法为整数缩放级别(如9)转换为这些增量值?
作为奖励的问题是有没有办法来指定上的MKMapView一个最小最大缩放级别:)
谢谢
首先, 的MKMapView并不使用/有一组预定义的缩放级别像谷歌地图做的。
取而代之的是,使用MKCoordinateRegion,它由两个值中的所描述的的MKMapView的可见区域:
- 中心 (该区域的中心点),并且
- 跨度 (中心周围可见区域的大小)。
中心点应该清楚(这是该区域的中心点)。
然而,跨度(这是一个MKCoordinateSpan)组成:
- latitudeDelta(由区域表示的垂直距离),并
- longitudeDelta(由区域表示的水平距离)。
一个简单的例子。 这里有一个玩具MKCoordinateRegion:
- 中央:
- 跨度:
- latitudeDelta:8
- longitudeDelta:6
该区域可以通过使用它的MIN来描述和最大坐标如下:
- 分钟坐标(左下点):
- 最大坐标(右上点):
所以,你可以通过使用适当大小的MKCoordinateSpan指定围绕一个中心点的缩放级别。 作为谷歌的数字变焦水平的近似值,你可以反向工程,谷歌使用一个给定的缩放级别跨度的大小,并创建一个跨度,因此。 (谷歌描述了他们的观点地区,在同样的方式,做的MKMapView作为中心+跨度,所以你可以把这些值了谷歌地图。)
至于限制区域,你可以玩瓦特/此委托方法:
mapView:regionWillChangeAnimated
例如,通过调整该区域回您的允许的缩放级别。 (有点像表视图将如何让你滚过的边缘,但随后将橡皮筋回原位。)然而,你的里程可能会有所不同,因为我还没有将它用于此目的。
顺便说一句,有在OS 3.1明确的修复/改进到了给我的麻烦在3.0 MapKit的各个方面。
如果你喜欢使用显式缩放级别,而不是定义MKCoordinateSpan,我写了一个类别,增加了指定的MKMapView的缩放级别的支持。 该代码可以找到这里 。
跨度为纬度和经度。 有用于构建MKCoordinateRegion结构即需要的距离,而不是方法。 这可能是你正在使用MKCoordinateRegionMakeWithDistance指定范围,然后当你在regionDidChange检查一下,你在经/纬度跨度,这是它是如何存储在MKCoordinateRegion结构看。
据我所知,有MKMapKit工作时,整数缩放级别不可用或根本有用。 我个人比较喜欢使用跨度的数字,它更灵活。
您不能指定最大值和最小值变焦,我不知道的方式破解它。MKMapKit现在实际上是相当弱的,我对缺乏特色非常失望。
缩放级别的使用maps.google.com通过检查链接查询字符串中某个位置的快速比较表明,2倍dx和dy跨度值增加:
(0.005334, 0.011834) starting span
(0.010668, 0.023668) dx: x2, dy: x2
(0.021335, 0.047337) dx: x2, dy: x2
(0.042671, 0.094671) dx: x2, dy: x2
...
布兰特的上的MKMapView类效果很好。 但是,看来,它一直没有更新计算mapSizeInPixels当视网膜屏幕,支持新的设备。
它可以是固定的通过更换此行:
CGSize mapSizeInPixels = mapView.bounds.size;
有了这条线:
CGSize mapSizeInPixels = CGSizeMake(mapView.bounds.size.width * [UIScreen mainScreen].scale, mapView.bounds.size.height * [UIScreen mainScreen].scale);