標籤:介紹 屬性 間隔 post size 錯誤 .com void gpo
一、概念
加速計:通過感知特定方向的慣性力總量,測量x,y,z軸三個方向的加速度。
陀螺儀:測量繞x、y、z 三個方向的旋轉的值。特性:如果保持手機平放的同時旋轉它,加速計的值不會改變,此時它將是繞 Z 軸的旋轉值發生改變。順時針旋轉裝置將產生負值,逆時針旋轉產生正值。
二、 CoreMotion架構
加速計和陀螺儀是通過 Core Motion 架構訪問的。此架構提供了 CMMotionManager等類,該類提供的所有資料都用來描述使用者如何行動裝置。
Core Motion 擷取資料的兩種方式:
push : 即時採集所有資料,採集頻率高;
pull : 在有需要的時候,才去採集資料;
加速計 :
push: - (void)startAccelerometerUpdatesToQueue:(NSOperationQueue *)queue withHandler:(CMAccelerometerHandler)handler;
pull: - (void)startAccelerometerUpdates;
判斷加速計是否可用:
@property(readonly, nonatomic, getter=isAccelerometerAvailable) BOOL accelerometerAvailable;
設定加速計採樣的時間間隔:
@property(assign, nonatomic) NSTimeInterval accelerometerUpdateInterval;
陀螺儀 :
push: - (void)startGyroUpdatesToQueue:(NSOperationQueue *)queue withHandler:(CMGyroHandler)handler;
pull: - (void)startGyroUpdates;
判斷陀螺儀是否可用:
@property(readonly, nonatomic, getter=isGyroAvailable) BOOL gyroAvailable;
設定陀螺儀採樣的時間間隔:
@property(assign, nonatomic) NSTimeInterval gyroUpdateInterval;
磁力 :
push: - (void)startMagnetometerUpdatesToQueue:(NSOperationQueue *)queue withHandler:(CMMagnetometerHandler)handler;
pull: - (void)startMagnetometerUpdates;
判斷磁力是否可用:
@property(readonly, nonatomic, getter=isGyroAvailable) BOOL gyroAvailable
設定磁力採樣的時間間隔:
@property(assign, nonatomic) NSTimeInterval magnetometerUpdateInterval
範例程式碼:
檢測搖動
方式一 : 在正常使用中,3個軸上的註冊值高達1.3g,但擷取比該值更大的值通常需要特意施加力量。加速計不太可能註冊比 2.3g 更大的值,所以不需要設定比該值更大的值。要檢測搖動,我們可以通過檢查比1.5大的絕對值來檢測細微搖動,通過檢查比 2.0更大的值來檢測強烈的搖動。
檢測任何軸上的力大於2.0g的任何運動:
我們可以實現更複雜的搖動檢測,要求使用者來回搖動一定次數以註冊為搖動:
方式二 :
還有一種檢測搖動的方法,這種方法被結合到了響應者鏈中。iOS提供了3個類似的響應程式方法來檢測動作:
動作開始時: - (void)motionBegan:(UIEventSubtype)motion withEvent:(UIEvent *)event;
動作結束時: - (void)motionEnded:(UIEventSubtype)motion withEvent:(UIEvent *)event;
動作取消時: - (void)motionCancelled:(UIEventSubtype)motion withEvent:(UIEvent *)event;(搖動期間電話響鈴或其他幹擾動作)
三、 感知裝置移動
除了擷取加速度資料、陀螺儀資料和磁場資料之外,CMMotionManager 還可以用於感知裝置移動資料。與前擷取加速度資料、陀螺儀資料、磁場資料的方式完全相同,程式可通過如下兩種方式來感知裝置的移動資料。
使用基於代碼的方式擷取裝置移動資料;
使用哪個周期性主動請求的方式擷取裝置移動資料;
擷取裝置移動資料時, CMMotionManager將會返回一個 CMDeviceMotion對象,該對象包含如下屬性:
attitude:該屬性返回裝置的方位資訊。該屬性的分那會至是一個 CMAttitude 類型的對象,該對象包含roll、pitch、yaw 3個歐拉角的值,通過這3個值即可擷取該裝置的空間方位;
rotationRate:該屬性返回原始的陀螺儀資訊,該屬性值為 CMRotationRate 結構體變數,該屬性值基本等同於前面介紹的陀螺儀資料;
gravity: 該屬性返回地球重力對該裝置在 X、Y、Z軸上施加的重力加速度;
userAcceleration:該屬性返回使用者外力對該裝置在 X、Y、Z軸上施加的重力加速度;
magneticField:該屬性返回校準後的磁場資訊。該屬性值是一個 CMCalibratedMagneticField 結構體變數。CMCalibratedMagneticField 類型的變數包括 field 和 accuracy兩個欄位,其中 field 代表 X、Y、Z 軸上的磁場強度, accuracy 則代表磁場強度的精度;
四、iOS 7新增的計步器
iOS 7新增的 CMStepCounter 作為計步器,該計歩器可以擷取使用者攜帶該裝置行走的步數, iOS裝置通過手機內建硬體來儲存使用者行走的步數。程式通過該類即可擷取使用者當前行走的步數,也可查詢使用者行走的曆史活動資料。
注意:iOS 8 用 CMPedometer 代替。
iOS 8 新增的 CMPedometer 代替 iOS 7 的 CMStepCounter 作為計步器,該計步器可以擷取使用者攜帶該裝置行走的步數。該類包含如下幾個方法:
該方法跟 CMStepCounter 一樣,判斷計步器服務是否可用:
+ (BOOL)isStepCountingAvailable;
判斷計算距離是否可用:
+ (BOOL)isDistanceAvailable;
判斷計算層樓測量是否可用:
+ (BOOL)isFloorCountingAvailable;
該方法進行即時測量,第一個參數是指進行即時測量的開始時間;第二個參數是 block ^(CMPedometerData *pedometerData, NSError *error);其中 pedometerData 為測量資料,error 為測量錯誤資訊:
-(void)startPedometerUpdatesFromDate:(NSDate*)start withHandler:(CMPedometerHandler)handler;
停止計步服務:
-(void)stopPedometerUpdates;
第一個參數為開始時間;第二個參數為結束時間;第三個參數為 block^(CMPedometerData *pedometerData, NSError *error);其中 pedometerData 為測量資料, error 為測量錯誤資訊。
-(void)queryPedometerDataFromDate:(NSDate*)start toDate:(NSDate*)end withHandler:(CMPedometerHandler)handler;
iOS 加速計和陀螺儀