ios學(xué)習(xí)筆記之地圖(上)

一 前言

ios8.0之后與ios8.0之前,對(duì)于CoreLocation的使用痕钢,還是有很大區(qū)別的港华。本文介紹下CLLocationManager類的基本使用刻蟹、如何做簡(jiǎn)單的區(qū)域監(jiān)聽以及一個(gè)指南針小案例。

二 CLLocationManager類的基本使用及ios8.0與ios9.0的對(duì)比

首先要導(dǎo)入頭文件
"#import <CoreLocation/CoreLocation.h>"

需要獲取用戶位置信息時(shí)淘捡,要?jiǎng)?chuàng)建CLLocationManager位置管理者對(duì)象藕各。

創(chuàng)建一個(gè)位置管理者

@property (nonatomic, strong) CLLocationManager *lm;

現(xiàn)在先懶加載下lm對(duì)象

#pragma mark - 懶加載
- (CLLocationManager *)lm{
    if (!_lm) {
        _lm = [[CLLocationManager alloc] init];
        _lm.delegate = self; // 設(shè)置代理
//        每隔多少米定位一次,如果不設(shè)置該值就會(huì)頻繁調(diào)用代理方法"didUpdateLocations"方法
        _lm.distanceFilter = 100;
        
// desiredAccuracy 屬性的取值,查看頭文件焦除,搜索CLLocationAccuracy座韵,可以找到如下內(nèi)容
//  extern const CLLocationAccuracy kCLLocationAccuracyBestForNavigation // 最適合導(dǎo)航
//  extern const CLLocationAccuracy kCLLocationAccuracyBest; //最好的
//  extern const CLLocationAccuracy kCLLocationAccuracyNearestTenMeters;//10米
//  extern const CLLocationAccuracy kCLLocationAccuracyHundredMeters;//100米
//  extern const CLLocationAccuracy kCLLocationAccuracyKilometer;//1000米
//  extern const CLLocationAccuracy kCLLocationAccuracyThreeKilometers;//300米
        
        
//        ios8.0之后的定位適配*********************************
        if ([[UIDevice currentDevice].systemVersion floatValue] >= 8.0) {
            //        精確度越高,越耗電踢京,定位時(shí)間越長(zhǎng)
            _lm.desiredAccuracy = kCLLocationAccuracyBest;
            //        前臺(tái)定位授權(quán)誉碴,默認(rèn)情況下,不可以在后臺(tái)獲取位置瓣距,勾選后臺(tái)模式location update
            [_lm requestWhenInUseAuthorization];
            //        前后臺(tái)定位授權(quán)(請(qǐng)求永久授權(quán)黔帕,在Plist里添加key:NSLocationAlwaysUsageDescription)
//            [_lm requestAlwaysAuthorization];
        }

//        或者先判斷_lm對(duì)象是否能夠響應(yīng)requestAlwaysAuthorization方法,能響應(yīng)就執(zhí)行,這樣就不需要知道該方法是作用于8.0之后的
//        if ([_lm respondsToSelector:@selector(requestAlwaysAuthorization)]) {
//            [_lm requestAlwaysAuthorization];
//        }
        
    }
    return _lm;
}

在ios9.0后蹈丸,又多了判斷是否可以在后臺(tái)更新位置allowsBackgroundLocationUpdates
那么我們的適配又要多一個(gè)判斷

- (CLLocationManager *)lm{
    if (!_lm) {
        _lm = [[CLLocationManager alloc] init];
        _lm.delegate = self;
        _lm.distanceFilter = 100;
        
//        8.0定位適配*********************************
        if ([[UIDevice currentDevice].systemVersion floatValue] >= 8.0) {
            _lm.desiredAccuracy = kCLLocationAccuracyBest;
            //        前臺(tái)定位授權(quán)成黄,默認(rèn)情況下呐芥,不可以在后臺(tái)獲取位置,要勾選后臺(tái)模式location update
           [_lm requestWhenInUseAuthorization];
            
        }

        //            ios9.0之后奋岁,期望進(jìn)入后臺(tái)也能定位思瘟,多了這個(gè)allowsBackgroundLocationUpdates屬性需配置,進(jìn)入后臺(tái)運(yùn)行時(shí)闻伶,頂部有藍(lán)條滨攻,與8.0版本一樣
//        所以遇到了版本是9.0的用戶,又要適配下
        if ([[UIDevice currentDevice].systemVersion floatValue] >= 9.0) {
//            command點(diǎn)擊該屬性進(jìn)入文件查看蓝翰,會(huì)發(fā)現(xiàn)警告你使用該屬性時(shí)光绕,一定要勾選后臺(tái)模式location updates
            _lm.allowsBackgroundLocationUpdates = YES;
        }
    }
    return _lm;
}

當(dāng)位置改變后,通過代理來告知我們畜份。

// 點(diǎn)擊屏幕诞帐,開始測(cè)試
- (void)touchesBegan:(NSSet<UITouch *> *)touches withEvent:(UIEvent *)event{
    
    [self.lm startUpdatingLocation];
    
//    [self.lm requestLocation];// 這個(gè)方法現(xiàn)在已經(jīng)不常用了,了解即可爆雹,該方法頭文件使用說明說停蕉,其不能與startUpdatingLocation or  allowDeferredLocationUpdates同時(shí)用
    
    
//    測(cè)試下distanceFromLocation方法,緯度上相差1度钙态,地理上大概相差111km
//    CLLocation *lo1 = [[CLLocation alloc] initWithLatitude:21.77 longitude:22.99];
//    CLLocation *lo2 = [[CLLocation alloc] initWithLatitude:22.77 longitude:22.99];
//    CLLocationDistance distance = [lo1 distanceFromLocation:lo2];
//    NSLog(@"distance = %f",distance);
//    結(jié)果:2017-03-06 17:03:47.123 地圖ios8.0+[90641:12476302] distance = 110733.934092   (大概是111km)
    
}

#pragma mark - CLLocationManagerDelegate
- (void)locationManager:(CLLocationManager *)manager didUpdateLocations:(NSArray<CLLocation *> *)locations{
    NSLog(@"定位到了");
    
//    拿到數(shù)組里最新的數(shù)據(jù)lastObject
    
    /**
     *  CLLocation詳解
     *  coordinate :坐標(biāo)慧起,經(jīng)緯度
     *  altitude:海拔
     *  course:航向
     *  speed:速度
     *  latitude:緯度
     *  longtitude:經(jīng)度
     */
    CLLocation *location = [locations lastObject];
    
    /**
     * 場(chǎng)景演練:打印當(dāng)前用戶的行走方向,偏離角度以及對(duì)應(yīng)的行走距離,
     * 例如:”北偏東30度方向,移動(dòng)了8米”
     *
     */
    
//    1 獲取方向偏向
    NSString *angleStr = nil;
    
    switch ((int)location.course / 90) {
        case 0:
            angleStr = @"北偏東";
            break;
        case 1:
            angleStr = @"東偏南";
            break;
        case 2:
            angleStr = @"南偏西";
            break;
        case 3:
            angleStr = @"西偏北";
            break;
            
        default:angleStr = @"跑溝里去了";
            break;
    }
//    2 偏向角度
    NSInteger angle = 0;
    angle = (int)location.course % 90;
    
//    正方向
    if (angle == 0) {
        angleStr = [angleStr substringToIndex:1];
        
        angleStr = [NSString stringWithFormat:@"正%@",angleStr];
    }
    
    
//    3 移動(dòng)多少米
    double distance = 0;
    if (_oldL) {
        distance = [location distanceFromLocation:_oldL];
    }
    
    _oldL = location;
//    4 拼串打印
    NSString *noticeStr = [NSString stringWithFormat:@"%@%zd度方向,移動(dòng)了%f米",angleStr,angle,distance];
    NSLog(@"%@",noticeStr);
}


/**
 授權(quán)狀態(tài)發(fā)生改變時(shí)調(diào)用

 @param manager 位置管理者
 @param status 狀態(tài)
 */
- (void)locationManager:(CLLocationManager *)manager didChangeAuthorizationStatus:(CLAuthorizationStatus)status{
//    CLAuthorizationStatus是枚舉類型驯绎,我們可以依照源文件完慧,來解析下當(dāng)前的用戶位置狀態(tài)
    NSLog(@"status = %d",status);
    
    
}

/**
 定位失敗(配合requestLocation方法)

 @param manager <#manager description#>
 @param error <#error description#>
 */
- (void)locationManager:(CLLocationManager *)manager didFailWithError:(NSError *)error{
    
}

打開模擬器,選擇你需要的模擬位置變化狀態(tài)剩失。

三 區(qū)域監(jiān)聽
#import "ViewController.h"
#import <CoreLocation/CoreLocation.h>
@interface ViewController ()<CLLocationManagerDelegate>
@property (nonatomic, strong) CLLocationManager *lM;
@end

@implementation ViewController
// 懶加載
- (CLLocationManager *)lM{
    if (!_lM) {
        _lM = [[CLLocationManager alloc] init];
        _lM.delegate = self;
        
        if ([[UIDevice currentDevice].systemVersion floatValue] >= 8.0) {
            [_lM requestAlwaysAuthorization];
        }
        
    }
    return _lM;
}


- (void)touchesBegan:(NSSet<UITouch *> *)touches withEvent:(UIEvent *)event{
    
//    給定區(qū)域region屈尼,標(biāo)識(shí)為@"qingyun"
    CLLocationCoordinate2D center = {21.33,123.99};
    CLCircularRegion *region = [[CLCircularRegion alloc] initWithCenter:center radius:1000 identifier:@"qingyun"]; //identifier是用來標(biāo)識(shí)具體是哪個(gè)區(qū)域的
//    開始監(jiān)聽區(qū)域region
    [self.lM startMonitoringForRegion:region];
    
    //    給定區(qū)域regin2,標(biāo)識(shí)為@"qingyun2"
    CLLocationCoordinate2D center2 = {33.33,123.99};
    CLCircularRegion *regin2 = [[CLCircularRegion alloc] initWithCenter:center2 radius:1000 identifier:@"qingyun2"];
    //    開始監(jiān)聽區(qū)域region2
    [self.lM startMonitoringForRegion:regin2];
    
//    請(qǐng)求指定區(qū)域的狀態(tài)(狀態(tài)包括:1 無法監(jiān)聽到 2 在該區(qū)域內(nèi) 3 在該區(qū)域外)
    [self.lM requestStateForRegion:region];
    
}

#pragma mark - CLLocationManagerDelegate
//進(jìn)入?yún)^(qū)域拴孤,只有當(dāng)你動(dòng)態(tài)進(jìn)入時(shí)脾歧,才會(huì)調(diào)用
- (void)locationManager:(CLLocationManager *)manager didEnterRegion:(CLRegion *)region{
    NSLog(@"進(jìn)入?yún)^(qū)域,%@",region.identifier);
}

//離開區(qū)域,當(dāng)你動(dòng)態(tài)離開該區(qū)域時(shí)演熟,才會(huì)調(diào)用
- (void)locationManager:(CLLocationManager *)manager didExitRegion:(CLRegion *)region{
    NSLog(@"離開區(qū)域,%@",region.identifier);
}


// 獲取某個(gè)指定區(qū)域的狀態(tài)鞭执,是在該區(qū)域里面,還是在該區(qū)域外面芒粹,還是無法監(jiān)聽到
- (void)locationManager:(CLLocationManager *)manager didDetermineState:(CLRegionState)state forRegion:(CLRegion *)region{
    
    NSString *str = nil;
//    CLRegionStateUnknown,
//    CLRegionStateInside,
//    CLRegionStateOutside
    switch (state) {
        case CLRegionStateUnknown:
            str = @"CLRegionStateUnknown";
            break;
         case CLRegionStateInside:
            str = @"CLRegionStateInside";
            break;
        case CLRegionStateOutside:
            str = @"CLRegionStateOutside";
            break;
        default:
            str = @"我不知道";
            break;
    }
    
    NSLog(@"state = %@  region.identifier = %@",str,region.identifier);
    
}

//運(yùn)行之后會(huì)打有址摹:
//[94660:13100043] state = CLRegionStateInside  region.identifier = qingyun

//將模擬器經(jīng)緯度從:{21.33,123.99}改成:{22.33,123.99}后會(huì)有如下打印:
//2017-03-10 11:13:48.246 CoreLocation-區(qū)域監(jiān)聽[94660:13100043] 離開區(qū)域,qingyun
//2017-03-10 11:13:48.247 CoreLocation-區(qū)域監(jiān)聽[94660:13100043] state = CLRegionStateOutside  region.identifier = qingyun



@end

模擬器Debug->Location->CustomLocation 可以修改下當(dāng)前位置

四 指南針的基本實(shí)現(xiàn)

首先選擇一個(gè)指南針圖片到你的項(xiàng)目里

單純的做指南針(指向的方向其實(shí)是磁極的南和北)是不需要授權(quán)的化漆,因?yàn)楂@取用戶方向不牽扯到用戶隱私

#import "ViewController.h"
#import <CoreLocation/CoreLocation.h>
@interface ViewController ()<CLLocationManagerDelegate>
@property (nonatomic, strong) CLLocationManager *lm;
@property (weak, nonatomic) IBOutlet UIImageView *compass;

@end

@implementation ViewController
#pragma mark - 懶加載

- (CLLocationManager *)lm{
    if (!_lm) {
        _lm = [[CLLocationManager alloc] init];
        _lm.delegate = self;
//        每隔多少度更新一次
        _lm.headingFilter = 2;    
    }
    return _lm;
}

- (void)viewDidLoad {
    [super viewDidLoad];
//    開始更新設(shè)備朝向
    [self.lm startUpdatingHeading];
}


#pragma mark - CLLocationManagerDelegate

/**
 獲取到手機(jī)朝向時(shí)調(diào)用

 @param manager 位置管理者
 @param newHeading 朝向?qū)ο? */
- (void)locationManager:(CLLocationManager *)manager didUpdateHeading:(CLHeading *)newHeading{
    
    /**
     * CLHeading
     * magneticHeading:磁北角度
     * trueHeading:真北角度
     */
    
    NSLog(@"%f",newHeading.magneticHeading);
    
//    角度轉(zhuǎn)弧度
    CGFloat angle = newHeading.magneticHeading;
    
    CGFloat angleR = angle / 180.0 * M_PI;
    
    [UIView animateWithDuration:0.25 animations:^{
//        讓指南針上指向北邊的指針估脆,始終指向北邊,與人轉(zhuǎn)動(dòng)方向相反
        self.compass.transform = CGAffineTransformMakeRotation(-angleR);
    }];

    
}


@end
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末座云,一起剝皮案震驚了整個(gè)濱河市疙赠,隨后出現(xiàn)的幾起案子付材,更是在濱河造成了極大的恐慌,老刑警劉巖圃阳,帶你破解...
    沈念sama閱讀 218,122評(píng)論 6 505
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件厌衔,死亡現(xiàn)場(chǎng)離奇詭異,居然都是意外死亡捍岳,警方通過查閱死者的電腦和手機(jī)富寿,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,070評(píng)論 3 395
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來祟同,“玉大人作喘,你說我怎么就攤上這事理疙≡纬牵” “怎么了?”我有些...
    開封第一講書人閱讀 164,491評(píng)論 0 354
  • 文/不壞的土叔 我叫張陵窖贤,是天一觀的道長(zhǎng)砖顷。 經(jīng)常有香客問我,道長(zhǎng)赃梧,這世上最難降的妖魔是什么滤蝠? 我笑而不...
    開封第一講書人閱讀 58,636評(píng)論 1 293
  • 正文 為了忘掉前任,我火速辦了婚禮授嘀,結(jié)果婚禮上物咳,老公的妹妹穿的比我還像新娘。我一直安慰自己蹄皱,他們只是感情好览闰,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,676評(píng)論 6 392
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著巷折,像睡著了一般压鉴。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上锻拘,一...
    開封第一講書人閱讀 51,541評(píng)論 1 305
  • 那天油吭,我揣著相機(jī)與錄音,去河邊找鬼署拟。 笑死婉宰,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的推穷。 我是一名探鬼主播心包,決...
    沈念sama閱讀 40,292評(píng)論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼,長(zhǎng)吁一口氣:“原來是場(chǎng)噩夢(mèng)啊……” “哼缨恒!你這毒婦竟也來了谴咸?” 一聲冷哼從身側(cè)響起轮听,我...
    開封第一講書人閱讀 39,211評(píng)論 0 276
  • 序言:老撾萬榮一對(duì)情侶失蹤,失蹤者是張志新(化名)和其女友劉穎岭佳,沒想到半個(gè)月后血巍,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 45,655評(píng)論 1 314
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡珊随,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,846評(píng)論 3 336
  • 正文 我和宋清朗相戀三年述寡,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片叶洞。...
    茶點(diǎn)故事閱讀 39,965評(píng)論 1 348
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡鲫凶,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出衩辟,到底是詐尸還是另有隱情螟炫,我是刑警寧澤,帶...
    沈念sama閱讀 35,684評(píng)論 5 347
  • 正文 年R本政府宣布艺晴,位于F島的核電站昼钻,受9級(jí)特大地震影響,放射性物質(zhì)發(fā)生泄漏封寞。R本人自食惡果不足惜然评,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,295評(píng)論 3 329
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望狈究。 院中可真熱鬧碗淌,春花似錦、人聲如沸抖锥。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,894評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽宁改。三九已至缕探,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間还蹲,已是汗流浹背爹耗。 一陣腳步聲響...
    開封第一講書人閱讀 33,012評(píng)論 1 269
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留谜喊,地道東北人潭兽。 一個(gè)月前我還...
    沈念sama閱讀 48,126評(píng)論 3 370
  • 正文 我出身青樓,卻偏偏與公主長(zhǎng)得像斗遏,于是被迫代替她去往敵國和親山卦。 傳聞我的和親對(duì)象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,914評(píng)論 2 355

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

  • 簡(jiǎn)介 在移動(dòng)互聯(lián)網(wǎng)時(shí)代诵次,移動(dòng)app能解決用戶的很多生活瑣事账蓉,比如 周邊:找餐館枚碗、找KTV、找電影院等等 導(dǎo)航:根據(jù)...
    JonesCxy閱讀 1,202評(píng)論 1 1
  • CoreLocation框架 一. iOS8.0之前的定位(?????) 前臺(tái)定位導(dǎo)入CoreLocation框架...
    尼古拉斯趙四爺閱讀 973評(píng)論 0 2
  • 地圖(CoreLocation和MapKit) CoreLocation框架CoreLocationCLLocat...
    superWX閱讀 11,154評(píng)論 11 51
  • 其一新剝的白花生子石爐是奶奶手砌請(qǐng)守護(hù)袋里的米我往溪邊接水去 其二山的氧和泉的水一齊咕嚕著鍋蓋干樹枝的火苗兒聽到也...
    楊樹存閱讀 512評(píng)論 1 1
  • 公子王孫鬼去憐铸本, 從來冷眼不相關(guān)肮雨。 世間真意于何處? 唯有農(nóng)人系語間箱玷。
    小啟明星閱讀 232評(píng)論 0 11