瘋狂ios講義之使用CoreLocation定位(3)-創(chuàng)新互聯(lián)

9.3  方向監(jiān)測
擁有GPS硬件的設備可以生成設備的當前方向(course屬性)和速度信息。iPhone設備攜帶的定位管理器可以返回一個已經(jīng)計算好的course值,通過這個值我們可以獲得當前前進的方向,course值是0~360之間的浮點數(shù),0°值表示正北方向,90°值表示正東方向,180°值表示正南方向,270°值表示正西方向,程序可以通過course值來檢測用戶位置的移動方向。除此之外,還可以通過磁力計來獲取設備的真實方向。
提示:

創(chuàng)新互聯(lián)專注為客戶提供全方位的互聯(lián)網(wǎng)綜合服務,包含不限于成都網(wǎng)站設計、做網(wǎng)站、東昌網(wǎng)絡推廣、微信小程序、東昌網(wǎng)絡營銷、東昌企業(yè)策劃、東昌品牌公關、搜索引擎seo、人物專訪、企業(yè)宣傳片、企業(yè)代運營等,從售前售中售后,我們都將竭誠為您服務,您的肯定,是我們大的嘉獎;創(chuàng)新互聯(lián)為所有大學生創(chuàng)業(yè)者提供東昌建站搭建服務,24小時服務熱線:18982081108,官方網(wǎng)址:muchs.cn

地球是一個大磁場,磁力計的北極將會永遠真實地指向北方。

 iOS系統(tǒng)通過heading屬性來獲取設備的真實方向。需要指出的是,并不是所有的iOS設備都支持heading屬性,從iPhone 3gs開始引入了磁力計,因此程序在獲取方向之前需要先測試該設備是否支持heading。如果定位管理器支持heading屬性,那么CLLocationManager的headingAvailable屬性將會返回“YES”。
使用CLLocationManager獲取設備方向與獲取移動距離的步驟基本相似,只是此時不是檢測位置移動,而是檢測方向改變。
使用CLLocationManager獲取設備方向的步驟如下。
創(chuàng)建CLLocationManager對象,該對象負責獲取定位相關信息。并為該對象設置一些必要的屬性。
為CLLocationManager指定delegate屬性,該屬性值必須是一個實現(xiàn)CLLocationManagerDelegate協(xié)議的對象。實現(xiàn)CLLocationManagerDelegate協(xié)議時可根據(jù)需要實現(xiàn)協(xié)議中特定的方法。
調(diào)用CLLocationManager的startUpdatingHeading方法獲取方向信息。獲取方向結(jié)束時,可調(diào)用stopUpdatingHeading方法結(jié)束獲取方向信息。
當設備的方向改變時,iOS系統(tǒng)將會自動激發(fā)CLLocationManager的delegate對象的locationManager:didUpdateHeading:方法,而程序可通過重寫該方法來獲取設備方向。
 iOS允許為檢測方向改變設置如下屬性。
CLLocationDegrees headingFilter:設置只有當設備方向的改變值超過該屬性值時才激發(fā)delegate的方法。
CLDeviceOrientation headingOrientation:設置設備當前方向。
監(jiān)聽方向時返回的是一個CLHeading對象,該對象包含如下屬性。
magneticHeading:該屬性返回設備與磁北的相對方向。
trueHeading:該屬性返回設備與真北的相對方向。  提示:真北始終指向地理北極點;磁北則對應于隨時間變化的地球磁場北極。iOS系統(tǒng)使用一個計算后的偏移量(稱為偏差)來確定這兩者之間的差異。

headingAccuracy:該屬性返回方向值的誤差范圍。
timestamp:該屬性返回方向值的生成時間。
x:獲取該設備在X方向上監(jiān)聽得到的原始磁力值,該磁力值的強度單位是微特斯拉。
y:獲取該設備在Y方向上監(jiān)聽得到的原始磁力值,該磁力值的強度單位是微特斯拉。
z:獲取該設備在Z方向上監(jiān)聽得到的原始磁力值,該磁力值的強度單位是微特斯拉。
在啟用該功能的iOS設備上,即使用戶在Settings應用中關閉了定位更新,磁向更新仍然可以使用。此外,使用heading服務的應用不會提示用戶授權問題,因此磁向信息不會泄露用戶的隱私,應用程序可以隨便使用它。
需要說明的是,trueHeading屬性需要與位置探測功能一起使用,iOS系統(tǒng)需要設備的位置來計算確定真北所需要的偏差。偏差隨地理位置的變化而變化,比如北京的偏差不同于東京的偏差,也不同于新加坡和馬來西亞的偏差等。有一些地方根本不能使用磁力計進行讀數(shù)。
除此之外,在某些特殊位置例如有強磁、強電干擾的地方,磁力計可能無法使用。
實例:指南針此實例將會示范如何使用磁力計來獲取設備方向,然后根據(jù)設備方向來創(chuàng)建一個指南針應用。新建一個Single View Application,無須修改界面設計文件,直接在應用的視圖控制器類的實現(xiàn)部分創(chuàng)建界面,并讓應用中顯示方向的圖片隨著設備方向自動旋轉(zhuǎn)即可。
下面是該應用的視圖控制器類的實現(xiàn)部分代碼。

程序清單: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所示的效果。

瘋狂ios講義之使用CoreLocation定位(3)

————本文節(jié)選自《瘋狂ios講義(下)》

瘋狂ios講義之使用CoreLocation定位(3)

另外有需要云服務器可以了解下創(chuàng)新互聯(lián)scvps.cn,海內(nèi)外云服務器15元起步,三天無理由+7*72小時售后在線,公司持有idc許可證,提供“云服務器、裸金屬服務器、高防服務器、香港服務器、美國服務器、虛擬主機、免備案服務器”等云主機租用服務以及企業(yè)上云的綜合解決方案,具有“安全穩(wěn)定、簡單易用、服務可用性高、性價比高”等特點與優(yōu)勢,專為企業(yè)上云打造定制,能夠滿足用戶豐富、多元化的應用場景需求。

網(wǎng)頁名稱:瘋狂ios講義之使用CoreLocation定位(3)-創(chuàng)新互聯(lián)
分享URL:http://muchs.cn/article26/dejdcg.html

成都網(wǎng)站建設公司_創(chuàng)新互聯(lián),為您提供網(wǎng)站設計公司、網(wǎng)站收錄網(wǎng)站改版、品牌網(wǎng)站設計外貿(mào)建站、ChatGPT

廣告

聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶投稿、用戶轉(zhuǎn)載內(nèi)容為主,如果涉及侵權請盡快告知,我們將會在第一時間刪除。文章觀點不代表本網(wǎng)站立場,如需處理請聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時需注明來源: 創(chuàng)新互聯(lián)

網(wǎng)站優(yōu)化排名