这篇文章有以下三个知识点
- 设置地图类型
- 在地图上面显示用户位置
- 设置用户大头针信息
显示地图:
在storyboard中拖个MKMapView或是用代码创建个MKMapView添加到视图中就可以了。
注意import MapKit,不然会报错。
设置地图类型
设置地图类型只需设置MKMapView的mapType属性。
open var mapType: MKMapType // 地图类型
MKMapType是一个结构体
public enum MKMapType : UInt {
case standard //标准类型
case satellite // 卫星类型
case hybrid // 标准和卫星结合的混合类型
}
MKMapType枚举还有一些其他的值,但是目前在中国还没有支持,了解下就可以了。
下面是mapType属性的使用代码和效果图
@IBOutlet weak var mapView: MKMapView!
/// 切换segmentController值变化的时候调用这个方法
///
/// - Parameter sender: UISegmentedControl
@IBAction func segmentControlValueChange(_ sender: UISegmentedControl) {
switch sender.selectedSegmentIndex {
case 0:
mapView.mapType = .standard // 用标准类型
case 1:
mapView.mapType = .satellite // 用卫星类型
case 2:
mapView.mapType = .hybrid // 用标准和卫星混合的类型
default:
break
}
}
标准类型效果图:
卫星类型效果图:
混合类型效果图:
提示:
卫星类型和混合类型不仔细看的话没太大区别,放大地图看的话会有很大区别
卫星类型用的比较少,因为看不到城市等信息。
以上更改地图类型的代码可以简洁为一句
/// 切换segmentController值变化的时候调用这个方法
///
/// - Parameter sender: UISegmentedControl
@IBAction func segmentControlValueChange(_ sender: UISegmentedControl) {
mapView.mapType = MKMapType(rawValue: UInt(sender.selectedSegmentIndex))!
}
在地图上面显示用户位置
要显示用户位置,需要两步
- 获取用户位置授权
- 设置MKMapView的userTrackingMode属性
获取用户位置授权在我之前的文章写过了。浅谈iOS定位,这里就不啰嗦了。
userTrackingMode属性
open var userTrackingMode: MKUserTrackingMode // 用户追踪模式
MKUserTrackingMode是个结构体
public enum MKUserTrackingMode : Int {
case none // 不获取用户位置
case follow // 获取用户位置不显示方向信息
case followWithHeading // 获取用户位置显示方向信息
}
实例代码:
@IBOutlet weak var mapView: MKMapView!
var manager = CLLocationManager()
override func viewDidLoad() {
super.viewDidLoad()
// 请求用户授权
manager.requestWhenInUseAuthorization()
// 获取用户位置不显示方向信息
// mapView.userTrackingMode = .follow
// 获取用户位置显示方向信息
mapView.userTrackingMode = .followWithHeading
}
mapView.userTrackingMode = .follow的效果图:
mapView.userTrackingMode = .followWithHeading的效果图:
设置用户大头针信息
没有实现功能前的效果图:
实现功能后的效果图:
代码实现:
@IBOutlet weak var mapView: MKMapView!
var manager = CLLocationManager()
override func viewDidLoad() {
super.viewDidLoad()
// 请求用户授权
manager.requestWhenInUseAuthorization()
// 设置用户追踪模式
mapView.userTrackingMode = .follow
// mapView.userTrackingMode = .followWithHeading
mapView.delegate = self
}
/// 更新用户位置完成时候调用的MKMapView代理方法
///
/// - Parameters:
/// - mapView: MKMapView
/// - userLocation: 用户位置属性
func mapView(_ mapView: MKMapView, didUpdate userLocation: MKUserLocation) {
let geocoder = CLGeocoder()
// 反地理编码
geocoder.reverseGeocodeLocation(userLocation.location!) { (placemarks: [CLPlacemark]?, error: Error?) in
// 设置用户位置的标题是城市
userLocation.title = placemarks?.last?.locality
// 设置用户位置的子标题是具体位置
userLocation.subtitle = placemarks?.last?.name
}
}
MKUserLocation这个类指的是地图上显示用户当前位置的圆点。设置title和subtitle属性就可以设置用户位置信息。
这个类遵守了MKAnnotation协议,实现了title和subtitle属性。
MKAnnotation协议
public protocol MKAnnotation : NSObjectProtocol {
public var coordinate: CLLocationCoordinate2D { get }. // 经纬度类
optional public var title: String? { get } // 标题
optional public var subtitle: String? { get } // 子标题
}
总结:
设置用户位置知识点只需要两步
- 设置代理,实现mapView完成用户位置更新方法。因为实现这个代理方法才能获取MKUserLocation对象
- 设置MKUserLocation这个类的title和subtitle属性
以上代码设置用户位置信息知识点涉及到地理编码,如果不熟悉,可以参考笔者之前的iOS地理编码的简单实现
这篇文章就写到这里,希望对你们有帮助。