現(xiàn)在手機軟件基本上都需要定位担扑,比如打個的恰响,附近的人,附近的餐廳等等涌献,這些應用都需要定位和地圖服務胚宦。
我這個人分不清東西南北,很容易轉蒙圈了,在梳理IOS知識之前枢劝,我先總結一下經(jīng)緯度的知識井联,我記不住一樣長的是經(jīng)度還是緯度,所以我通過谷歌老師了解到您旁,很好記憶烙常,因為我們一般都會說東經(jīng)西經(jīng),所以經(jīng)線是和赤道平行的線鹤盒,肯定也包括赤道線蚕脏,而從南極到北極的連線叫經(jīng)線,希望我不會再忘記了侦锯。
在IOS里面針對定位服務驼鞭,實現(xiàn)定位功能步驟如下
1.創(chuàng)建一個位置管理器:CLLocationManager類 對象locationManager
? ? ? ? 設置代理locationManager.delegate = self?
2.判斷是否啟用定位服務:locationServicesEnabled ->Bool ? ?
3.設置精度:locationManager.desireAccuarcy = kCLLocationAccuracyBest
? ? ? ?屬性:desiredAccuracy ? 用于定位精度
? ? ? ? ? ? ? ? ? ? kCLLocationAccuracyBestForNavigation? 最高精度,用于導航程序
? ? ? ? ? ? ? ? ? ? ?kCLLocationAccuracyBest 最精確
? ? ? ? ? ? ? ? ? ? ?kCLLocationAccuracyNearestTenMeters ? ?十米誤差范圍
? ? ? ? ? ? ? ? ? ? ?kCLLocationAccuracyHundredMeters ? ? ? ? 百米誤差范圍 ??
? ? ? ? ? ? ? ? ? ? ?kCLLocationAccuracyKilometer ? ? ? ? ? ? ? ? ?千米誤差范圍
? ? ? ? ? ? ? ? ? ? ?kCLLocationAccuracyThreeKilometers ? ? ? ?三千米誤差范圍
4.設置距離篩選器:locationManager.distanceFilter = 50? 當你移動一段位移后尺碰,所以移動距離大于篩選器說設置50m時候挣棕,通知委托更新位置;但是位置一段更新過于頻繁就會消耗電池電量葱蝗,我們可以返回它的默認的沒有篩選器模式穴张,使用常量kCLDistanceFilterNone细燎;
locationManager.distanceFilterkCLDistanceFilterNone
5.設置什么啟動(ios版本8.0.0以上的需要設置)
locationManager.requestWhenInUseAuthorization()//當App進入前臺時候開啟定位
locationManager.requestAlwaysAuthorization()//始終開啟
6. 然后就是啟動 位置管理器進行定位locationManager.startUpdatingLocation;??
如果我們不需要繼續(xù)輪詢更新位置可以使用locationManager.stopUpdatingLocation;
停止更新两曼,否則應用程序打開會一直更新,這些都需要添加委托的玻驻,遵循 ? ? ? ? ? ? ? ? ? ? ? ?CLLocationManagerDelegate協(xié)議
7.顯示實況地圖
經(jīng)緯度MKCoordinateSpan 和? 范圍 MKCoordinateRegion
struct MKCoordinateSpan{
? ? CLLocationDegrees latitudeDelta; ?//double類型?
? ? CLLocationDegrees longitudeDlta;
}
struct? MKCoordinateRegion{
? ? CLLocationCoordinate2Dcenter;//表示顯示的中心
? ? MKCoordinateSpanspan;//表示比例
}
方向?qū)Ш?/p>
? ? startUpdatingHeading ?開始方向?qū)Ш???
? ? stopUpdatingHeading ?停止方向?qū)Ш?/p>
需要注意的是
? ? 1.定位的頻率和精度不是越精度越好悼凑,因為耗能費電的原因
? ? 2.定位成功后會返回數(shù)組,每個元素代表一個CLLocation位置信息
? ? 3.除了提供定位功能? CLLocationManager還可以調(diào)用startMonitoringForRegion:方法對指定區(qū)域進行監(jiān)控
地理編碼 ?
? ?由于上面的只能讀取經(jīng)度和緯度璧瞬,不能獲取具體的城市位置等等户辫,需要進行逆地理編碼和地理編碼
? ?CLGeocoder 主要兩個方法 ?定位的結果是一個CLPlacemark
?geocodeAddressString(addressString:String!,completionHandler:CLGeocodeCompletionHandler!)?
geocodeAddressString(addressString:String!, inRegion region:CLRegion!, completionHandler:CLGeocodeCompletionHandler!)
逆地理編碼
reverseGeocodeLocation(location:CLLocation!, completionHandler:CLGeocodeCompletionHandler!)
地圖 MapKit
IOS 地圖開發(fā)有兩種方式:1.使用MapKit框架 ?2.直接調(diào)用蘋果官方自帶的地圖應用,無法進行精確的控制嗤锉。 重點是MapKit
MapKit框架提供MKMapView控件
屬性
? ? mapType?
? ? ? ? ? ? MKMapTypeStandard :標準地圖渔欢,一般情況下使用此地圖即可滿足;
? ? ? ? ? ? MKMapTypeSatellite :衛(wèi)星地圖瘟忱;
? ? ? ? ? ? MKMapTypeHybrid :混合地圖奥额,加載最慢比較消耗資源;
? ?userLocation ?用戶位置
? annotations ?當前地圖所有大頭針访诱,只讀屬性?
方法
? ? addAnnotations ? ? ?添加大頭針?
? ? removeAnnotations ?刪除大頭針
? ? setRegion ? ?設置顯示區(qū)域
? ? dequeueReusableAnnotationViewWithIdentifier ?從緩存池中取大頭針(類似Cell)
代理方法
? ? didSelectAnnotationView ?點擊選中某個大頭針觸發(fā)
? ? var ? point:MKPointAnnotation=MKPointAnnotation()
注意:
a.這個代理方法的調(diào)用時機:每當有大頭針顯示到系統(tǒng)可視界面中時就會調(diào)用此方法返回一個大頭針視圖放到界面中垫挨,同時當前系統(tǒng)位置標注(也就是地圖中藍色的位置點)也是一個大頭針,也會調(diào)用此方法触菜,因此處理大頭針視圖時需要區(qū)別對待九榔。
b.類似于UITableView的代理方法,此方法調(diào)用頻繁,開發(fā)過程中需要重復利用MapKit的緩存池將大頭針視圖緩存起來重復利用哲泊。
c.自定義大頭針默認情況下不允許交互剩蟀,如果交互需要設置canShowCallout=true
d.如果代理方法返回nil則會使用默認大頭針視圖,需要根據(jù)情況設置切威。
參考互聯(lián)網(wǎng)資源整理喻旷。