Swift - 获取、设置MKMapView的地图缩放级别(zoomlevel)
作者:hangge | 2017-12-13 08:10
使用 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)
}
}
源码下载:
全部评论(1)
这样缩放等级会有问题吧
站长回复:不会啊,会有什么问题?