9.3 方向監(jiān)測
擁有GPS硬件的設(shè)備可以生成設(shè)備的當(dāng)前方向(course屬性)和速度信息。iPhone設(shè)備攜帶的定位管理器可以返回一個(gè)已經(jīng)計(jì)算好的course值,通過這個(gè)值我們可以獲得當(dāng)前前進(jìn)的方向,course值是0~360之間的浮點(diǎn)數(shù),0°值表示正北方向,90°值表示正東方向,180°值表示正南方向,270°值表示正西方向,程序可以通過course值來檢測用戶位置的移動(dòng)方向。除此之外,還可以通過磁力計(jì)來獲取設(shè)備的真實(shí)方向。
提示:
站在用戶的角度思考問題,與客戶深入溝通,找到永靖網(wǎng)站設(shè)計(jì)與永靖網(wǎng)站推廣的解決方案,憑借多年的經(jīng)驗(yàn),讓設(shè)計(jì)與互聯(lián)網(wǎng)技術(shù)結(jié)合,創(chuàng)造個(gè)性化、用戶體驗(yàn)好的作品,建站類型包括:成都網(wǎng)站制作、做網(wǎng)站、企業(yè)官網(wǎng)、英文網(wǎng)站、手機(jī)端網(wǎng)站、網(wǎng)站推廣、域名與空間、網(wǎng)絡(luò)空間、企業(yè)郵箱。業(yè)務(wù)覆蓋永靖地區(qū)。
地球是一個(gè)大磁場,磁力計(jì)的北極將會(huì)永遠(yuǎn)真實(shí)地指向北方。
iOS系統(tǒng)通過heading屬性來獲取設(shè)備的真實(shí)方向。需要指出的是,并不是所有的iOS設(shè)備都支持heading屬性,從iPhone 3gs開始引入了磁力計(jì),因此程序在獲取方向之前需要先測試該設(shè)備是否支持heading。如果定位管理器支持heading屬性,那么CLLocationManager的headingAvailable屬性將會(huì)返回“YES”。程序清單:codes/09/9.3/Compass/Compass/FKViewController.m
@interface FKViewController () <CLLocationManagerDelegate> { CALayer* znzLayer; } @property (nonatomic , strong)CLLocationManager *locationManager; @end @implementation FKViewController - (void)viewDidLoad { [super viewDidLoad]; // 如果磁力計(jì)可用,則開始監(jiān)聽方向改變 if([CLLocationManager headingAvailable]) { // 創(chuàng)建顯示方向的指南針圖片Layer znzLayer = [[CALayer alloc] init]; NSInteger screenHeight = [UIScreen mainScreen].bounds.size.height; NSInteger y = (screenHeight - 320) / 2; znzLayer.frame = CGRectMake(0 , y , 320, 320); // 設(shè)置znzLayer顯示的圖片 znzLayer.contents = (id)[[UIImage p_w_picpathNamed:@"znz.png"] CGImage]; // 將znzLayer添加到系統(tǒng)的UIView中 [self.view.layer addSublayer:znzLayer]; // 創(chuàng)建CLLocationManager對象 self.locationManager = [[CLLocationManager alloc] init]; self.locationManager.delegate = self; [self.locationManager startUpdatingHeading]; } // 如果磁力計(jì)不可用,則使用UIAlertView顯示提示信息 else { // 使用警告框提醒用戶 [[[UIAlertView alloc] initWithTitle:@"提醒" message:@"您的設(shè)備不支持磁力計(jì)" delegate:self cancelButtonTitle:@"確定" otherButtonTitles: nil] show]; } } // 當(dāng)成功獲取設(shè)備的方向值后激發(fā)該方法 -(void)locationManager:(CLLocationManager *)manager didUpdateHeading:(CLHeading *)newHeading { // 將設(shè)備的方向角度換算成弧度 CGFloat headings = -1.0f * M_PI * newHeading.magneticHeading / 180.0f; // 創(chuàng)建不斷改變CALayer的transform屬性的屬性動(dòng)畫 CABasicAnimation* anim = [CABasicAnimation animationWithKeyPath:@"transform"]; CATransform3D fromValue = znzLayer.transform; // 設(shè)置動(dòng)畫開始的屬性值 anim.fromValue = [NSValue valueWithCATransform3D: fromValue]; // 繞Z軸旋轉(zhuǎn)heading弧度的變換矩陣 CATransform3D toValue = CATransform3DMakeRotation(headings , 0 , 0 , 1); // 設(shè)置動(dòng)畫結(jié)束的屬性 anim.toValue = [NSValue valueWithCATransform3D: toValue]; anim.duration = 0.5; anim.removedOnCompletion = YES; // 設(shè)置動(dòng)畫結(jié)束后znzLayer的變換矩陣 znzLayer.transform = toValue; // 為znzLayer添加動(dòng)畫 [znzLayer addAnimation:anim forKey:nil]; } -(BOOL)locationManagerShouldDisplayHeadingCalibration:(CLLocationManager *)manager { return YES; } @end
上面程序中的前兩行粗體字代碼用于為CLLocationManager設(shè)置delegate屬性,接下來程序調(diào)用該對象的startUpdatingHeading方法開始監(jiān)聽設(shè)備的方向改變——當(dāng)設(shè)備的方向改變時(shí),系統(tǒng)會(huì)自動(dòng)激發(fā)CLLocationManager設(shè)置delegate的locationManager:didUpdateHeading:方法,程序的視圖控制器重寫了該方法,并在該方法中獲取設(shè)備方向,然后將圖片“反轉(zhuǎn)”相應(yīng)的角度,從而讓圖片的北極總是指向真實(shí)的北極。
編譯、運(yùn)行該應(yīng)用(要在真機(jī)上測試該應(yīng)用,因?yàn)閕OS模擬器不支持磁力計(jì)),將可以看到如圖9.5所示的效果。
————本文節(jié)選自《瘋狂ios講義(下)》
本文標(biāo)題:瘋狂ios講義之使用CoreLocation定位(3)
網(wǎng)站路徑:http://chinadenli.net/article44/gpdshe.html
成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供域名注冊、關(guān)鍵詞優(yōu)化、搜索引擎優(yōu)化、電子商務(wù)、App設(shè)計(jì)、網(wǎng)站排名
聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶投稿、用戶轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請盡快告知,我們將會(huì)在第一時(shí)間刪除。文章觀點(diǎn)不代表本網(wǎng)站立場,如需處理請聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時(shí)需注明來源: 創(chuàng)新互聯(lián)