当前位置: > > > Swift - 获取、设置MKMapView的地图缩放级别(zoomlevel)

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
评论1
  • 1楼
    2017-12-16 12:22
    EL

    这样缩放等级会有问题吧

    站长回复

    不会啊,会有什么问题?