(iOS)會(huì)使用定位功能嗎? 不會(huì)就來看看吧

一.定位功能

1.ios7中的定位

1.1 導(dǎo)入 CoreLocation框架

1.2 創(chuàng)建 CLLocationManager對(duì)象
注意:要用強(qiáng)指針指向這個(gè)對(duì)象,一般采用懶加載來創(chuàng)建

 private lazy var mgr : CLLocationManager = CLLocationManager()

1.3 設(shè)置代理,實(shí)現(xiàn)代理方法

1.4 開始定位

 mgr.startUpdatingLocation()

1.5 優(yōu)點(diǎn):不需要設(shè)置用戶的授權(quán)

在info.plist加上一個(gè)key Privacy - Location Usage Description 寫在value上的文字,可以顯示在提示權(quán)限的文本框內(nèi)

2.ios8(之后)的定位

2.1 請(qǐng)求定位步驟

2.11 導(dǎo)入CoreLocation框架
2.12 懶加載CLLocationManager對(duì)象
2.13 請(qǐng)求授權(quán) (1) whenInUse (2) always
2.14 注意:必須把授權(quán)對(duì)應(yīng)的key值 添加到info.plist文件中
2.15 設(shè)置代理,實(shí)現(xiàn)代理方法
2.16 開始定位

2.2 定位屬性的應(yīng)用

2.21 精確度的使用

desiredAccuracy精確度越高,越耗電
屬性接收double類型的值,不過最好傳系統(tǒng)給定好的值
kCLLocationAccuracyBestForNavigation: 導(dǎo)航精確度(最精確)
kCLLocationAccuracyBest: 最好精確度(默認(rèn))
kCLLocationAccuracyNearestTenMeters: 10米的誤差
kCLLocationAccuracyHundredMeters: 100米的誤差
kCLLocationAccuracyKilometer: 千米誤差
kCLLocationAccuracyThreeKilometers: 三千米的誤差

    mgr.desiredAccuracy = kCLLocationAccuracyBestForNavigation

2.22 移動(dòng)一段距離,再次重新定位
設(shè)置用于移動(dòng)多少距離,重新進(jìn)行定位

         mgr.distanceFilter = 100

2.3 位置信息的獲取

2.31 發(fā)送完請(qǐng)求定位,怎么獲取位置信息?
在代理方法的閉包中,有一個(gè)數(shù)組,返回了很多信息在里面

2.32 我們常用的信息就是經(jīng)緯度

二.計(jì)算兩個(gè)經(jīng)緯度的距離

1.獲取當(dāng)前位置信息

1.1 導(dǎo)入框架
1.2 懶加載管理者對(duì)象
1.3 請(qǐng)求授權(quán)
1.4 添加key值
1.5 設(shè)置代理,實(shí)現(xiàn)代理方法
1.6 開始定位

2.獲取另一個(gè)位置的經(jīng)緯度

.

3.計(jì)算兩個(gè)位置的距離 distanceFromLocation

三.簡(jiǎn)易指南針的制作

1.實(shí)現(xiàn)思路

監(jiān)聽手機(jī)頭方向的改變,在手機(jī)屏幕上放一張圖片,始終指向北(根據(jù)手機(jī)方向的改變旋轉(zhuǎn))

2.界面搭建

拖一個(gè)UIImageView放在屏幕中央,里面放一張圖片

3.監(jiān)聽手機(jī)頭方向的改變

3.1 怎么監(jiān)聽?
通過發(fā)送請(qǐng)求(定位服務(wù)),獲取手機(jī)頭的方向進(jìn)行監(jiān)聽

3.2 具體實(shí)現(xiàn)

3.21 導(dǎo)入CoreLocation框架
3.22 懶加載CLLocationManager對(duì)象

      3.23 請(qǐng)求授權(quán) (1) whenInUse (2) always
      3.24 注意:必須把授權(quán)對(duì)應(yīng)的key值 添加到info.plist文件中
      3.25 設(shè)置代理,實(shí)現(xiàn)代理方法
      3.26 請(qǐng)求手機(jī)頭方向
      3.27 獲取真北方向
      3.28 將真北方向轉(zhuǎn)換為弧度
      3.29 讓圖片根據(jù)弧度進(jìn)行旋轉(zhuǎn)(注意:圖片旋轉(zhuǎn)的弧度要取反 ,  要和屏幕旋轉(zhuǎn)方向相反才能保持一直指向一個(gè)方向)

4.對(duì)指南針優(yōu)化

4.1 真實(shí)的指南針指向一個(gè)位置,會(huì)來回?cái)[動(dòng)兩下才固定位置
代碼實(shí)現(xiàn)的指南針沒有這個(gè)效果

4.2 如何實(shí)現(xiàn)這個(gè)效果?
可以通過一個(gè)動(dòng)畫來實(shí)現(xiàn)

    // Damping : 阻力系數(shù) (0~1.0)      initialSpringVelocity:回彈速度
    UIView.animateWithDuration(0.5, delay: 0.0, 
usingSpringWithDamping: 0.8, initialSpringVelocity: 5.0, 
options: [], animations: {

        self.imageView.transform = transform
        }, completion: nil)

四.區(qū)域監(jiān)聽

1.需求,當(dāng)進(jìn)入某指向區(qū)域,提醒用戶進(jìn)入該區(qū)域,離開該區(qū)域也對(duì)用戶進(jìn)行提醒

.

2.實(shí)現(xiàn)方案步驟

2.1 懶加載 CLLocationManager對(duì)象
2.2 請(qǐng)求授權(quán)(注意:必須使用alyays授權(quán)方式) ,配置info文件
2.3 設(shè)置代理
2.4 創(chuàng)建監(jiān)聽區(qū)域
2.5 實(shí)現(xiàn)代理方法 并 開始監(jiān)聽

3.注意點(diǎn)

3.1 當(dāng)之前添加過監(jiān)聽區(qū)域時(shí),再次添加新的監(jiān)聽區(qū)域,還會(huì)對(duì)之前的區(qū)域進(jìn)行監(jiān)聽

3.2 不想監(jiān)聽之前的區(qū)域,必須通過代碼移除之前的區(qū)域

五.地理編碼&反地理編碼

需求:輸入地理名稱,地理編碼獲得該位置的經(jīng)緯度. 輸入經(jīng)緯度,輸出對(duì)應(yīng)位置的地理名稱

1.界面搭建

1.1 整個(gè)界面放在屏幕的中心,怎么實(shí)現(xiàn)?

1.11 可以用view包裝
優(yōu)缺點(diǎn):要做大量的約束 , 但可以應(yīng)用于任何版本

1.12 ios9之后可以用UIStackView來包裝
優(yōu)缺點(diǎn):布局簡(jiǎn)便 只能適用于ios9(之后)

2.地理編碼

2.1 拿到用戶輸入的地理名稱 (導(dǎo)入框架CoreLocation)

2.2 地理編碼

2.21 創(chuàng)建 CLGeocoder對(duì)象
2.22 對(duì)地理名稱進(jìn)行地理編碼

    geocoder.geocodeAddressString(address) { (<#[CLPlacemark]?#>, <#NSError?#>) in
        <#code#>
    }

2.23 對(duì)閉包中的CLPlacemark數(shù)據(jù)就行解析(遍歷)
一個(gè)地理名稱可能對(duì)應(yīng)多個(gè)地方,所以編碼后的到的結(jié)果是一個(gè)數(shù)組

2.24 獲取數(shù)組中元素的地理位置(經(jīng)緯度)

2.25 將經(jīng)緯度顯示到界面

3.反地理編碼

3.1 拿到用戶輸入的經(jīng)緯度

3.2 對(duì)經(jīng)緯度進(jìn)行反地理編碼

3.21 創(chuàng)建 CLGeocoder對(duì)象
3.22 對(duì)經(jīng)緯度進(jìn)行反地理編碼

 geocoder.reverseGeocodeLocation(location) { (<#[CLPlacemark]?#>, <#NSError?#>) in
        <#code#>
    }

3.23 對(duì)閉包中的CLPlacemark數(shù)據(jù)就行解析(遍歷)
一個(gè)經(jīng)緯度可能對(duì)應(yīng)多個(gè)位置(蘋果這么設(shè)計(jì)的) 所以編碼后返回一個(gè)數(shù)組
一個(gè)位置包含多個(gè)信息(省/市/街道/國(guó)家/經(jīng)緯度/) 編碼后的結(jié)果是字典數(shù)組

3.24 取出數(shù)組中的一個(gè)位置(字典),再獲取位置信息(取出字典的元素)

3.25 把獲取到的地理名稱顯示到界面

地理編碼&反地理編碼源代碼

class ViewController: UIViewController {

// MARK:- 控件屬性
@IBOutlet weak var addressTextView: UITextView!
@IBOutlet weak var latitudeTextField: UITextField!
@IBOutlet weak var longitudeTextField: UITextField!
// MARK:- 懶加載屬性
private lazy var geocoder : CLGeocoder = CLGeocoder()
}

// MARK:- 地理編碼
extension ViewController {
@IBAction func geocode() {

    // 1.獲取用戶輸入的地址名稱
    guard let address = addressTextView.text else {
        return
    }
    // 2.對(duì)地理名稱進(jìn)行地理編碼
    geocoder.geocodeAddressString(address) { (placemarks : [CLPlacemark]?, error : NSError?) in
        // 1.錯(cuò)誤校驗(yàn)
        if error != nil {
            print(error)
            return
        }
        // 2.對(duì)結(jié)果進(jìn)行校驗(yàn)
        guard let placemarks = placemarks else {
            return
        }
        // 3.遍歷所有的結(jié)果
        for place in placemarks {
            print(place.name)

            // 獲取地理位置
            guard let location = place.location else {
                continue
            }

            // 獲取經(jīng)緯度
            let latitude = location.coordinate.latitude
            let longitude = location.coordinate.longitude

            // 將經(jīng)緯度顯示textField中
            self.latitudeTextField.text = "\(latitude)"
            self.longitudeTextField.text = "\(longitude)"
        }
    }
}
}

// MARK:- 反地理編碼
extension ViewController {
@IBAction func reverseGeocode() {
    // 1.獲取用戶輸入的經(jīng)緯度
    guard let latitude = latitudeTextField.text, let longitude = longitudeTextField.text else {
        return
    }

    // 2.將經(jīng)緯度轉(zhuǎn)成CLLocation對(duì)象
    guard let latitudeD = Double(latitude), let longitudeD = Double(longitude) else {
        return
    }
    let location = CLLocation(latitude: latitudeD, longitude: longitudeD)

    // 3.反地理編碼
    geocoder.reverseGeocodeLocation(location) { (placemarks : [CLPlacemark]?, error : NSError?) in
        // 1.錯(cuò)誤校驗(yàn)
        if error != nil {
            print(error)
            return
        }

        // 2.對(duì)結(jié)果進(jìn)行校驗(yàn)
        guard let placemarks = placemarks else {
            return
        }
        // 3.遍歷結(jié)果
        for place in placemarks {
            guard let addressDict = place.addressDictionary else {
                continue
            }

            guard let addressArray = addressDict["FormattedAddressLines"] as? [String] else {
                continue
            }

            guard let address = addressArray.last else {
                continue
            }

            self.addressTextView.text = address
        }
    }
}
}

六.把定位封裝為工具類

1.將工具類設(shè)計(jì)成單例對(duì)象

2.封裝請(qǐng)求方法,在方法中傳入閉包

2.1 使用屬性將閉包保存起來. (因?yàn)樵诖矸椒ú拍苣玫轿恢眯畔?
2.2 請(qǐng)求用戶位置(1.懶加載管理者對(duì)象,并在對(duì)象中直接設(shè)置請(qǐng)求授權(quán)和代理)

3.在代理方法中獲得用戶位置信息,并賦值給閉包屬性

4.停止請(qǐng)求用戶的位置

 mgr.stopUpdatingLocation()

5.當(dāng)?shù)谝淮伟l(fā)送請(qǐng)求位置信息,會(huì)返回多次位置信息,怎么解決這個(gè)問題?
用戶只需要定義一個(gè)Bool屬性,對(duì)屬性進(jìn)行判斷,為true就接收返回的位置信息

七.使用第三方框架請(qǐng)求位置信息

去github搜索LocationManager 找到框架去使用
一般用oc版的,swift也能用

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末聂沙,一起剝皮案震驚了整個(gè)濱河市秆麸,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌及汉,老刑警劉巖沮趣,帶你破解...
    沈念sama閱讀 219,539評(píng)論 6 508
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場(chǎng)離奇詭異坷随,居然都是意外死亡房铭,警方通過查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,594評(píng)論 3 396
  • 文/潘曉璐 我一進(jìn)店門温眉,熙熙樓的掌柜王于貴愁眉苦臉地迎上來缸匪,“玉大人,你說我怎么就攤上這事芍殖『浪裕” “怎么了?”我有些...
    開封第一講書人閱讀 165,871評(píng)論 0 356
  • 文/不壞的土叔 我叫張陵豌骏,是天一觀的道長(zhǎng)龟梦。 經(jīng)常有香客問我,道長(zhǎng)窃躲,這世上最難降的妖魔是什么计贰? 我笑而不...
    開封第一講書人閱讀 58,963評(píng)論 1 295
  • 正文 為了忘掉前任,我火速辦了婚禮蒂窒,結(jié)果婚禮上躁倒,老公的妹妹穿的比我還像新娘。我一直安慰自己洒琢,他們只是感情好秧秉,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,984評(píng)論 6 393
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著衰抑,像睡著了一般象迎。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上呛踊,一...
    開封第一講書人閱讀 51,763評(píng)論 1 307
  • 那天砾淌,我揣著相機(jī)與錄音,去河邊找鬼谭网。 笑死汪厨,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的愉择。 我是一名探鬼主播劫乱,決...
    沈念sama閱讀 40,468評(píng)論 3 420
  • 文/蒼蘭香墨 我猛地睜開眼织中,長(zhǎng)吁一口氣:“原來是場(chǎng)噩夢(mèng)啊……” “哼!你這毒婦竟也來了要拂?” 一聲冷哼從身側(cè)響起抠璃,我...
    開封第一講書人閱讀 39,357評(píng)論 0 276
  • 序言:老撾萬榮一對(duì)情侶失蹤,失蹤者是張志新(化名)和其女友劉穎脱惰,沒想到半個(gè)月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體窿春,經(jīng)...
    沈念sama閱讀 45,850評(píng)論 1 317
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡拉一,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 38,002評(píng)論 3 338
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了旧乞。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片蔚润。...
    茶點(diǎn)故事閱讀 40,144評(píng)論 1 351
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖尺栖,靈堂內(nèi)的尸體忽然破棺而出嫡纠,到底是詐尸還是另有隱情,我是刑警寧澤延赌,帶...
    沈念sama閱讀 35,823評(píng)論 5 346
  • 正文 年R本政府宣布除盏,位于F島的核電站,受9級(jí)特大地震影響挫以,放射性物質(zhì)發(fā)生泄漏者蠕。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,483評(píng)論 3 331
  • 文/蒙蒙 一掐松、第九天 我趴在偏房一處隱蔽的房頂上張望踱侣。 院中可真熱鬧,春花似錦大磺、人聲如沸抡句。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,026評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽待榔。三九已至,卻和暖如春殴蹄,著一層夾襖步出監(jiān)牢的瞬間究抓,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 33,150評(píng)論 1 272
  • 我被黑心中介騙來泰國(guó)打工袭灯, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留刺下,地道東北人钠署。 一個(gè)月前我還...
    沈念sama閱讀 48,415評(píng)論 3 373
  • 正文 我出身青樓枢冤,卻偏偏與公主長(zhǎng)得像俄删,于是被迫代替她去往敵國(guó)和親。 傳聞我的和親對(duì)象是個(gè)殘疾皇子稍计,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 45,092評(píng)論 2 355

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