9.3 方向監(jiān)測
擁有GPS硬件的設備可以生成設備的當前方向(course屬性)和速度信息。iPhone設備攜帶的定位管理器可以返回一個已經(jīng)計算好的course值,通過這個值我們可以獲得當前前進的方向,course值是0~360之間的浮點數(shù),0°值表示正北方向,90°值表示正東方向,180°值表示正南方向,270°值表示正西方向,程序可以通過course值來檢測用戶位置的移動方向。除此之外,還可以通過磁力計來獲取設備的真實方向。
提示:
站在用戶的角度思考問題,與客戶深入溝通,找到永靖網(wǎng)站設計與永靖網(wǎng)站推廣的解決方案,憑借多年的經(jīng)驗,讓設計與互聯(lián)網(wǎng)技術(shù)結(jié)合,創(chuàng)造個性化、用戶體驗好的作品,建站類型包括:成都網(wǎng)站制作、做網(wǎng)站、企業(yè)官網(wǎng)、英文網(wǎng)站、手機端網(wǎng)站、網(wǎng)站推廣、域名與空間、網(wǎng)絡空間、企業(yè)郵箱。業(yè)務覆蓋永靖地區(qū)。
地球是一個大磁場,磁力計的北極將會永遠真實地指向北方。
iOS系統(tǒng)通過heading屬性來獲取設備的真實方向。需要指出的是,并不是所有的iOS設備都支持heading屬性,從iPhone 3gs開始引入了磁力計,因此程序在獲取方向之前需要先測試該設備是否支持heading。如果定位管理器支持heading屬性,那么CLLocationManager的headingAvailable屬性將會返回“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];
// 如果磁力計可用,則開始監(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);
// 設置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];
}
// 如果磁力計不可用,則使用UIAlertView顯示提示信息
else
{
// 使用警告框提醒用戶
[[[UIAlertView alloc] initWithTitle:@"提醒"
message:@"您的設備不支持磁力計" delegate:self
cancelButtonTitle:@"確定" otherButtonTitles: nil]
show];
}
}
// 當成功獲取設備的方向值后激發(fā)該方法
-(void)locationManager:(CLLocationManager *)manager
didUpdateHeading:(CLHeading *)newHeading
{
// 將設備的方向角度換算成弧度
CGFloat headings = -1.0f * M_PI * newHeading.magneticHeading / 180.0f;
// 創(chuàng)建不斷改變CALayer的transform屬性的屬性動畫
CABasicAnimation* anim = [CABasicAnimation
animationWithKeyPath:@"transform"];
CATransform3D fromValue = znzLayer.transform;
// 設置動畫開始的屬性值
anim.fromValue = [NSValue valueWithCATransform3D: fromValue];
// 繞Z軸旋轉(zhuǎn)heading弧度的變換矩陣
CATransform3D toValue = CATransform3DMakeRotation(headings , 0 , 0 , 1);
// 設置動畫結(jié)束的屬性
anim.toValue = [NSValue valueWithCATransform3D: toValue];
anim.duration = 0.5;
anim.removedOnCompletion = YES;
// 設置動畫結(jié)束后znzLayer的變換矩陣
znzLayer.transform = toValue;
// 為znzLayer添加動畫
[znzLayer addAnimation:anim forKey:nil];
}
-(BOOL)locationManagerShouldDisplayHeadingCalibration:(CLLocationManager *)manager
{
return YES;
}
@end上面程序中的前兩行粗體字代碼用于為CLLocationManager設置delegate屬性,接下來程序調(diào)用該對象的startUpdatingHeading方法開始監(jiān)聽設備的方向改變——當設備的方向改變時,系統(tǒng)會自動激發(fā)CLLocationManager設置delegate的locationManager:didUpdateHeading:方法,程序的視圖控制器重寫了該方法,并在該方法中獲取設備方向,然后將圖片“反轉(zhuǎn)”相應的角度,從而讓圖片的北極總是指向真實的北極。
編譯、運行該應用(要在真機上測試該應用,因為iOS模擬器不支持磁力計),將可以看到如圖9.5所示的效果。

————本文節(jié)選自《瘋狂ios講義(下)》
本文標題:瘋狂ios講義之使用CoreLocation定位(3)
網(wǎng)站路徑:http://www.chinadenli.net/article44/gpdshe.html
成都網(wǎng)站建設公司_創(chuàng)新互聯(lián),為您提供域名注冊、關(guān)鍵詞優(yōu)化、搜索引擎優(yōu)化、電子商務、App設計、網(wǎng)站排名
聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶投稿、用戶轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請盡快告知,我們將會在第一時間刪除。文章觀點不代表本網(wǎng)站立場,如需處理請聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時需注明來源: 創(chuàng)新互聯(lián)