不少地圖 App 都會有一個當前定位的標記,該標記能夠根據用戶手持手機的朝向不一樣而改變方向。如圖:bash
若是要實現這個帶方向定位的標記點,須要什麼數據呢?app
定位數據獲取很簡單,調用 CLLocationManager
的 startUpdatingLocation()
方法,而後在 didUpdateLocations
的回調方法中能夠獲得的 CLLocation
屬性值。測試
CLLocation
對象中,除了有咱們須要的 coordinate 位置數據外,還有一個 course
屬性。spa
這個 course
屬性是否是咱們須要的手機朝向數據呢?code
course: The direction in which the device is traveling, measured in degrees and relative to due north.orm
Course values are measured in degrees starting at due north and continue clockwise around the compass. Thus, north is 0 degrees, east is 90 degrees, south is 180 degrees, and so on. Course values may not be available on all devices. A negative value indicates that the course information is invalid.cdn
從文檔的解釋來看,它是一個相對於地理北極以順時針方向的角度數據,手機朝着正北方是 0 度,朝着東邊是 90度,依次類推。對象
看起來是咱們想要的值。可是從實際測試(真機室內測試)結果看,這個值一直是返回 -1 。(負數表明此值當前不可用)blog
排除使用方式的不對,咱們從文檔 Getting Heading and Course Information 發現,咱們要獲取的實際上是 heading
的數據。文檔
經過調用 CLLocationManager 中的
startUpdatingHeading()
複製代碼
而後在 locationManager(_:didUpdateHeading:)
的回調方法中就能夠獲取到 heading 的數據了。
從字面意思上咱們能夠將它們區分爲 航向
和 朝向
Course(航向)信息
反映的是設備移動的速度和方向,而且僅在具備GPS硬件條件的設備上可用。
注意不要將 Course(航向)
與 Heading(朝向)
混淆。Course(航向) 反映的是設備移動時的方向,是從GPS信息中獲取到,它與設備的物理方向無關。
而 Heading(朝向)信息
則是經過計算手機上傳感器的值而獲取到的相對於地理北極的角度信息。
Course 經常是用在進行導航的狀況下。好比平時咱們開車進行導航的時候,有時候車子轉彎過快,會發現導航上的朝向並無及時更新到正確的方向,要過一會纔會更新,這就是由於 GPS 信息沒有及時更新過來,故 Course 信息也就沒法有足夠的數據支持它更新。
Heading 是與物理設備有關的值,因此咱們在獲取 Heading 信息的時候,注意要配置 CLLocationManager 的 headingOrientation
屬性。
headingOrientation 默認值是 portrait
,即咱們平時正面拿着手機。而當咱們正面橫着拿手機的時候,須要將 headingOrientation
屬性根據實際狀況改爲 landscapeLeft
或者 landscapeRight
,這樣系統才能經過手機的持有方位計算正確的 Heading
值,否則 Heading 就一直是默認以 portrait 的形式計算獲得。
HansonTalk | iOSTypist |
---|---|