使用
MapKit 框架提供的
MKMapView,我们可以很方便地在应用中显示地图。
MKMapView 使用也十分简单,只需设置好显示区域(中心点坐标,以及范围),地图就会自动缩放到合适的级别并显示。具体用法可以参考我之前写的这篇文章:
Swift - 使用MapKit显示地图,并在地图上做标记
但有时我们想要得到地图当前的缩放级别(
ZoomLevel)、或者想直接设置地图的缩放级别,
MKMapView 原生是不提供这个接口的。下面演示如何通过对
MKMapView 进行扩展来实现该功能。
1,扩展 MKMapView
(1)这里给
MKMapView 增加了个
zoomLevel 属性及相关方法。通过该属性可以获取或设置地图当前的缩放级别。具体实现方式如下:
- 获取 zoomLevel:由于 MKMapView 里地图的缩放级别是根据显示区域自动计算的,我们同样可以通过显示区域反算出对应的缩放级别。
- 设置 zoomLevel:同样地,我们可以通过缩放级别计算出对应的显示区域,并对 MKMapView 进行设置。
(2)缩放级别范围是:
2 -
20(其中
2 为世界地图)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
|
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)样例代码
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
|
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)
}
}
|
原文出自: www.hangge.com 转载请保留原文链接: http://www.hangge.com/blog/cache/detail_1878.html