Swift - 获取、设置MKMapView的地图缩放级别(zoomlevel)
使用 MapKit 框架提供的 MKMapView,我们可以很方便地在应用中显示地图。MKMapView 使用也十分简单,只需设置好显示区域(中心点坐标,以及范围),地图就会自动缩放到合适的级别并显示。具体用法可以参考我之前写的这篇文章:Swift - 使用MapKit显示地图,并在地图上做标记
但有时我们想要得到地图当前的缩放级别(ZoomLevel)、或者想直接设置地图的缩放级别,MKMapView 原生是不提供这个接口的。下面演示如何通过对 MKMapView 进行扩展来实现该功能。
1,扩展 MKMapView
(1)这里给 MKMapView 增加了个 zoomLevel 属性及相关方法。通过该属性可以获取或设置地图当前的缩放级别。具体实现方式如下:
- 获取 zoomLevel:由于 MKMapView 里地图的缩放级别是根据显示区域自动计算的,我们同样可以通过显示区域反算出对应的缩放级别。
- 设置 zoomLevel:同样地,我们可以通过缩放级别计算出对应的显示区域,并对 MKMapView 进行设置。
(2)缩放级别范围是:2 - 20(其中 2 为世界地图)
import MapKit extension MKMapView { //缩放级别 var zoomLevel: Int { //获取缩放级别 get { return Int(log2(360 * (Double(self.frame.size.width/256) / self.region.span.longitudeDelta)) + 1) } //设置缩放级别 set (newZoomLevel){ setCenterCoordinate(coordinate: self.centerCoordinate, zoomLevel: newZoomLevel, animated: false) } } //设置缩放级别时调用 private func setCenterCoordinate(coordinate: CLLocationCoordinate2D, zoomLevel: Int, animated: Bool){ let span = MKCoordinateSpanMake(0, 360 / pow(2, Double(zoomLevel)) * Double(self.frame.size.width) / 256) setRegion(MKCoordinateRegionMake(centerCoordinate, span), animated: animated) } }
2,使用样例
(1)效果图
- 缩放地图时,上方的文本标签以及 slider 会显示出当前对应的缩放级别。
- 而拖动 slider 滑块,MKMapView 也会自动显示对应缩放级别的地图。
(2)样例代码
import UIKit import MapKit import CoreLocation class ViewController: UIViewController, MKMapViewDelegate { //显示当前缩放级别的文本标签 @IBOutlet weak var label: UILabel! //设置缩放级别的滑块 @IBOutlet weak var slider: UISlider! //显示地图的MKMapView @IBOutlet weak var mapView: MKMapView! //定位管理器 let locationManager:CLLocationManager = CLLocationManager() override func viewDidLoad() { super.viewDidLoad() //设置代理 self.mapView.delegate = self //地图类型设置 - 标准地图 self.mapView.mapType = MKMapType.standard //创建一个MKCoordinateSpan对象,设置地图的范围(越小越精确) let latDelta = 0.05 let longDelta = 0.05 let currentLocationSpan:MKCoordinateSpan = MKCoordinateSpanMake(latDelta, longDelta) //定义地图区域和中心坐标 let center:CLLocation = CLLocation(latitude: 32.029171, longitude: 118.788231) let currentRegion:MKCoordinateRegion = MKCoordinateRegion(center: center.coordinate, span: currentLocationSpan) //设置显示区域 self.mapView.setRegion(currentRegion, animated: true) } //mapView显示区域改变时调用 func mapView(_ mapView: MKMapView, regionDidChangeAnimated animated: Bool) { label.text = "当前缩放级别:\(mapView.zoomLevel)" slider.value = Float(mapView.zoomLevel) } //滑块值改变时调用 @IBAction func sliderDidchange(_ sender: Any) { //将mapView设置成对应的缩放级别 mapView.zoomLevel = Int(slider.value) } }源码下载:hangge_1878.zip
这样缩放等级会有问题吧