MapKit :用于地圖展示崖蜜,例如大頭針,路線豫领、覆蓋層展示等(著重界面展示)
使用步驟
- 導入主頭文件 import MapKit 并在framework里面添加MapKit
- MapKit有一個比較重要的UI控件 :MKMapView等恐,專門用于地圖顯示
import UIKit
import MapKit
class ViewController: UIViewController {
@IBOutlet weak var mapkitView: MKMapView!
lazy var locationM : CLLocationManager =
{
let location = CLLocationManager()
if #available(iOS 8.0, *)
{
location.requestAlwaysAuthorization()
if #available(iOS 9.0, *)
{
location.allowsBackgroundLocationUpdates = true;
}
}
return location
}()
override func viewDidLoad()
{
super.viewDidLoad()
//1.設置地圖樣式,地圖的樣式可以手動設置, 在iOS9.0之前有3種, iOS9.0之后增加了2種
// case standard 標準
// case satellite // 衛(wèi)星
// case hybrid // 混合(標準加衛(wèi)星)
// @available(iOS 9.0, *)
// case satelliteFlyover 3D立體衛(wèi)星
// @available(iOS 9.0, *)
// case hybridFlyover 3D立體混合
mapkitView.mapType = .hybrid
//2.設置地圖的控制項 ,1. 地圖的旋轉, 縮放, 移動等等操作行為都可以開啟或者關閉
//mapkitView.isScrollEnabled = false //是否滾動
//mapkitView.isRotateEnabled = false //是否旋轉
//mapkitView.isZoomEnabled = false //是否縮放
//mapkitView.isPitchEnabled = false; // 是否顯示3DVIEW
//3. 設置地圖顯示項 ,地圖上的指南針, 比例尺, 建筑物, POI點都可以控制是否顯示
//建筑物
mapkitView.showsBuildings = true
if #available(iOS 9.0, *)
{
//指南針
mapkitView.showsCompass = true
//比例尺
mapkitView.showsScale = true
//交通狀況
mapkitView.showsTraffic = true
}
//興趣地點
mapkitView.showsPointsOfInterest = true
//4.1 顯示用戶位子
_ = locationM
// 顯示一個藍點, 在地圖上面標示用戶的位置信息. **注意事項: 如果要顯示用戶位置, 在iOS8.0之后, 需要主動請求用戶授權**
// 但是, 不會自動放大地圖, 并且當用戶 位置移動時, 地圖不會自動跟著跑
// mapkitView.showsUserLocation = true
//4.2 用戶的追蹤模式
// 顯示一個藍點, 在地圖上面標示用戶的位置信息
// 會自動放大地圖, 并且當用戶 位置移動時, 地圖會自動跟著跑
// 不靈光
mapkitView.userTrackingMode = .followWithHeading
}
}
模擬追蹤用戶的位子
mapkitView.delegate = self
//MARK: - MKMapViewDelegate -
extension ViewController : MKMapViewDelegate
{ // 當地圖更新用戶位置信息時, 調用的方法
// 藍點: 大頭針"視圖" 大頭針"數據模型"
func mapView(_ mapView: MKMapView, didUpdate userLocation: MKUserLocation)
{
//MKUserLocation 大頭針數據模型
// location : 就是大頭針的位置信息(經緯度)
// heading: 設備朝向對象
// title: 彈框標題
// subtitle: 彈框子標題
userLocation.title = "哥哥"
userLocation.subtitle = "工作中。二跋。流昏。"
// 移動地圖的中心,顯示在當前用戶所在的位置, 并改變區(qū)域
//MKCoordinateSpan 跨度解釋:
//latitudeDelta:緯度跨度,因為南北緯各90.0度谚鄙,所以此值的范圍
//是(0.0---180.0);此值表示撤逢,整個地圖視圖寬度粮坞,顯示多大跨度;
//longitudeDelta:經度跨度莫杈,因為東西經各180.0度筝闹,所以此值范圍是(0.0---360.0):此值表示,整個地圖視圖高度关顷,顯示多大跨度;
0.00805562331540699 0.006232607891206499
// mapView.setCenter(userLocation.coordinate, animated: true)
let center = (userLocation.location?.coordinate)!
let span = MKCoordinateSpan(latitudeDelta: 0.00805562331540699, longitudeDelta: 0.006232607891206499)
let region : MKCoordinateRegion = MKCoordinateRegion(center: center, span: span)
mapView.setRegion(region, animated: true)
}
//當地圖區(qū)域改變的時候調用议双,我們可以獲取顯示的span區(qū)域數據
func mapView(_ mapView: MKMapView, regionDidChangeAnimated animated: Bool)
{
print(mapView.region.span.latitudeDelta, mapView.region.span.longitudeDelta)
}
}
大頭針的使用
- 自定義大頭針模型
import UIKit
import MapKit
class UserAnnotation: NSObject, MKAnnotation
{
//確定大頭針的位置
var coordinate: CLLocationCoordinate2D = CLLocationCoordinate2DMake(0, 0)
//彈框標題
var title: String?
//子標題
var subtitle: String?
}
- 在地圖上操作大頭針,實際上是控制大頭針數據模型
- 添加大頭針就是添加大頭針數據模型
- 刪除大頭針就是刪除大頭針數據模型
override func touchesBegan(_ touches: Set<UITouch>, with event: UIEvent?)
{
//創(chuàng)建一個大頭針數據模型
let userAnnotation : UserAnnotation = UserAnnotation()
userAnnotation.coordinate = mapkitView.centerCoordinate
userAnnotation.title = "????好"
userAnnotation.subtitle = "子標題"
//添加到地圖上面
mapkitView.addAnnotation(userAnnotation)
}
override func touchesMoved(_ touches: Set<UITouch>, with event: UIEvent?)
{
//獲取所有大頭針的模型
let annotataions = mapkitView.annotations
//2. 移除
mapkitView.removeAnnotations(annotataions)
}
添加大頭針并顯示地理信息 用到反地理編碼
override func touchesBegan(_ touches: Set<UITouch>, with event: UIEvent?)
{
//1. 根據當前的點的位置 獲得在地圖上面的坐標
let point = touches.first?.location(in: mapkitView)
//經緯度
let coordinate = mapkitView.convert(point!, toCoordinateFrom: mapkitView)
//2.創(chuàng)建一個大頭針
let userAnnotation = : UserAnnotation = UserAnnotation()
userAnnotation.title = "title"
userAnnotation.subtitle = " "
userAnnotation.coordinate = coordinate
//反地理編碼 取得位子信息
geoCode.reverseGeocodeLocation(CLLocation(latitude: coordinate.latitude, longitude: coordinate.longitude))
{ (places, error) in
if error == nil
{
let mark = places?.first
userAnnotation.title = mark?.locality
userAnnotation.subtitle = mark?.name
self.mapkitView.addAnnotation(userAnnotation)
}
}