帶方向的定位小藍(lán)點(diǎn)--高德地圖ios

進(jìn)入最近很火的摩拜單車,你看到的是這樣的

mobike.gif

其實(shí)很早之前百度地圖和高德地圖就實(shí)現(xiàn)了這個(gè)功能,但是他們的SDK并沒(méi)有可以直接使用的屬性來(lái)造福大眾,想實(shí)現(xiàn)雖然不難,但還是要自己動(dòng)手,建議官方直接加一個(gè) isUserDirectionOpen 屬性,豈不美哉!

實(shí)現(xiàn)這個(gè)功能說(shuō)來(lái)也簡(jiǎn)單

1 獲取到用戶方向

2 根據(jù)方向旋轉(zhuǎn)箭頭


先做一下前期準(zhǔn)備工作

1.新建一個(gè)swift項(xiàng)目,導(dǎo)入高德地圖SDK
我用的是pods安裝高德地圖SDK
Podfile文件里面這樣寫就可以

platform :ios, "8.0"
use_frameworks!
target :'RotateArrow' do
pod 'AMap3DMap'
end

2.配置工程
新建橋接文件,在橋接文件中導(dǎo)入相關(guān)庫(kù)文件

#import <AMapFoundationKit/AMapFoundationKit.h>
#import <MAMapKit/MAMapKit.h>

在plist中添加鍵值
Privacy - Location When In Use Usage Description

App Transport Security Settings 的 Allow Arbitrary Loads


1.獲取設(shè)備方向

1). CoreLocation

CoreLocation里有個(gè)heading: CLHeading屬性,它包含了當(dāng)前的方向信息,CLHeading有三個(gè)屬性,地圖中自帶此信息

/*
     *  x
     *  
     *  Discussion:
     *    Returns a raw value for the geomagnetism measured in the x-axis.
     *
     */
    open var x: CLHeadingComponentValue { get }

    
    /*
     *  y
     *  
     *  Discussion:
     *    Returns a raw value for the geomagnetism measured in the y-axis.
     *
     */
    open var y: CLHeadingComponentValue { get }

    
    /*
     *  z
     *  
     *  Discussion:
     *    Returns a raw value for the geomagnetism measured in the z-axis.
     *
     */
    open var z: CLHeadingComponentValue { get }

以上摘自官方API,方向可根據(jù)這三個(gè)值算出來(lái)

在高德地圖的更新用戶位置的代理中可以獲取heading信息
func mapView(_ mapView: MAMapView!, didUpdate userLocation: MAUserLocation!, updatingLocation: Bool) {
      let heading = userLocation.heading     
}

2). CoreMotion

CoreMotion里根據(jù)deviceMotion里的attitude也可以獲取方向,網(wǎng)上有相關(guān)教程,有興趣的朋友可以自行百度下---詳說(shuō)CMDeviceMotion

2.根據(jù)方向旋轉(zhuǎn)箭頭

1). 用帶箭頭的圖片替換官方的小藍(lán)點(diǎn)
arrow.png

...渣圖勿噴,我直接在摩拜單車截了個(gè)圖用ps隨便扣的,這應(yīng)該不算侵權(quán)吧

在viewForAnnotation代理中替換系統(tǒng)視圖
///返回大頭針視圖
    func mapView(_ mapView: MAMapView!, viewFor annotation: MAAnnotation!) -> MAAnnotationView! {
        if annotation is MAUserLocation {
            var userView = mapView.dequeueReusableAnnotationView(withIdentifier: userAnnotationIdentifer)
            if userView == nil {
                userView = MAAnnotationView(annotation: annotation, reuseIdentifier: userAnnotationIdentifer)
            }
            userView!.image = UIImage(named: "arrow")
            return userView!
        }
        return nil
    }
IMG_1433.PNG
2).旋轉(zhuǎn)此圖片
func mapView(_ mapView: MAMapView!, didUpdate userLocation: MAUserLocation!, updatingLocation: Bool) {
        
        //取得用戶大頭針視圖
        let userView = mapView.view(for: userLocation)
      
        //取方向信息
       let userHeading = userLocation.heading 
        
        //根據(jù)方向旋轉(zhuǎn)箭頭
        userView.rotateWithHeading(heading: userHeading)
        
    }

rotateWithHeading是一個(gè)MAAnnotationView的擴(kuò)展

//針對(duì)MAAnnotationView的擴(kuò)展
extension MAAnnotationView {
    
    /// 根據(jù)heading信息旋轉(zhuǎn)大頭針視圖
    ///
    /// - Parameter heading: 方向信息
    func rotateWithHeading(heading: CLHeading) {
        
        //將設(shè)備的方向角度換算成弧度
        let headings = M_PI * heading.magneticHeading / 180.0
        //創(chuàng)建不斷旋轉(zhuǎn)CALayer的transform屬性的動(dòng)畫(huà)
        let rotateAnimation = CABasicAnimation(keyPath: "transform")
        //動(dòng)畫(huà)起始值
        let formValue = self.layer.transform
        rotateAnimation.fromValue = NSValue(caTransform3D: formValue)
        //繞Z軸旋轉(zhuǎn)heading弧度的變換矩陣
        let toValue = CATransform3DMakeRotation(CGFloat(headings), 0, 0, 1)
        //設(shè)置動(dòng)畫(huà)結(jié)束值
        rotateAnimation.toValue = NSValue(caTransform3D: toValue)
        rotateAnimation.duration = 0.35
        rotateAnimation.isRemovedOnCompletion = true
        //設(shè)置動(dòng)畫(huà)結(jié)束后layer的變換矩陣
        self.layer.transform = toValue
        
        //添加動(dòng)畫(huà)
        self.layer.add(rotateAnimation, forKey: nil)
        
    }
}

最后效果圖

end.gif

代碼已放到git上 DirectionMap

附錄:其他地圖原理類似,百度地圖方向?qū)崿F(xiàn)

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子吱肌,更是在濱河造成了極大的恐慌秦爆,老刑警劉巖骇窍,帶你破解...
    沈念sama閱讀 216,651評(píng)論 6 501
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件雌团,死亡現(xiàn)場(chǎng)離奇詭異绒窑,居然都是意外死亡颗味,警方通過(guò)查閱死者的電腦和手機(jī)扯俱,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,468評(píng)論 3 392
  • 文/潘曉璐 我一進(jìn)店門书蚪,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái),“玉大人迅栅,你說(shuō)我怎么就攤上這事殊校。” “怎么了读存?”我有些...
    開(kāi)封第一講書(shū)人閱讀 162,931評(píng)論 0 353
  • 文/不壞的土叔 我叫張陵为流,是天一觀的道長(zhǎng)。 經(jīng)常有香客問(wèn)我宪萄,道長(zhǎng)艺谆,這世上最難降的妖魔是什么? 我笑而不...
    開(kāi)封第一講書(shū)人閱讀 58,218評(píng)論 1 292
  • 正文 為了忘掉前任拜英,我火速辦了婚禮静汤,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘居凶。我一直安慰自己虫给,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,234評(píng)論 6 388
  • 文/花漫 我一把揭開(kāi)白布侠碧。 她就那樣靜靜地躺著抹估,像睡著了一般。 火紅的嫁衣襯著肌膚如雪弄兜。 梳的紋絲不亂的頭發(fā)上药蜻,一...
    開(kāi)封第一講書(shū)人閱讀 51,198評(píng)論 1 299
  • 那天,我揣著相機(jī)與錄音替饿,去河邊找鬼语泽。 笑死,一個(gè)胖子當(dāng)著我的面吹牛视卢,可吹牛的內(nèi)容都是我干的踱卵。 我是一名探鬼主播,決...
    沈念sama閱讀 40,084評(píng)論 3 418
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼据过,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼惋砂!你這毒婦竟也來(lái)了?” 一聲冷哼從身側(cè)響起绳锅,我...
    開(kāi)封第一講書(shū)人閱讀 38,926評(píng)論 0 274
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤西饵,失蹤者是張志新(化名)和其女友劉穎,沒(méi)想到半個(gè)月后榨呆,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體罗标,經(jīng)...
    沈念sama閱讀 45,341評(píng)論 1 311
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡庸队,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,563評(píng)論 2 333
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了闯割。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片彻消。...
    茶點(diǎn)故事閱讀 39,731評(píng)論 1 348
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖宙拉,靈堂內(nèi)的尸體忽然破棺而出宾尚,到底是詐尸還是另有隱情,我是刑警寧澤谢澈,帶...
    沈念sama閱讀 35,430評(píng)論 5 343
  • 正文 年R本政府宣布煌贴,位于F島的核電站,受9級(jí)特大地震影響锥忿,放射性物質(zhì)發(fā)生泄漏牛郑。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,036評(píng)論 3 326
  • 文/蒙蒙 一敬鬓、第九天 我趴在偏房一處隱蔽的房頂上張望淹朋。 院中可真熱鬧,春花似錦钉答、人聲如沸础芍。這莊子的主人今日做“春日...
    開(kāi)封第一講書(shū)人閱讀 31,676評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)仑性。三九已至,卻和暖如春右蹦,著一層夾襖步出監(jiān)牢的瞬間诊杆,已是汗流浹背。 一陣腳步聲響...
    開(kāi)封第一講書(shū)人閱讀 32,829評(píng)論 1 269
  • 我被黑心中介騙來(lái)泰國(guó)打工何陆, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留刽辙,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 47,743評(píng)論 2 368
  • 正文 我出身青樓甲献,卻偏偏與公主長(zhǎng)得像,于是被迫代替她去往敵國(guó)和親颂翼。 傳聞我的和親對(duì)象是個(gè)殘疾皇子晃洒,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,629評(píng)論 2 354

推薦閱讀更多精彩內(nèi)容

  • 發(fā)現(xiàn) 關(guān)注 消息 iOS 第三方庫(kù)、插件朦乏、知名博客總結(jié) 作者大灰狼的小綿羊哥哥關(guān)注 2017.06.26 09:4...
    肇東周閱讀 12,095評(píng)論 4 62
  • http://www.cnblogs.com/kenshincui/p/4125570.html 摘要: 現(xiàn)在很多...
    大崔老師閱讀 3,281評(píng)論 1 2
  • 想要練好拳球及,先要慢下來(lái)。這里的慢呻疹,包括慢慢學(xué)吃引,慢慢練,慢慢體會(huì),慢慢感應(yīng)品味镊尺。 慢慢學(xué):是要你耐心打好基礎(chǔ)朦佩,基礎(chǔ)要...
    日月耀九州閱讀 243評(píng)論 0 0
  • 火車正在飛馳著,由于群山萬(wàn)壑的原因庐氮,隧道重重语稠,窗外的景物忽閃忽閃,像是在看一部信號(hào)不穩(wěn)定的電視弄砍。還是大白...
    lolo007閱讀 325評(píng)論 0 8
  • 【摘錄】 聯(lián)結(jié)感受和需要 在沒(méi)有評(píng)判地觀察之后仙畦,要表達(dá)出你的感受與需要。對(duì)于需要的察覺(jué)是長(zhǎng)勁鹿語(yǔ)言的核心音婶。請(qǐng)記住慨畸,...
    Cynthia雯霏閱讀 237評(píng)論 0 0