標籤:
轉載自 http://bigbelldev.com/blog/2013/08/05/ios-accelerometer/大鐘威武 部落格iOS涉及到的感應器
不用查資料,用過iPhone的同學都知道。iphone中有加速度感應器,可以感知手機在哪個方向上有加速度,比如螢幕的翻轉、飛行控制遊戲等都是利用這個特徵做的;有指南針(貌似叫陀螺儀?),可以知道你的方向;還有定位裝置,可以知道你現在的位置在哪裡。
加速度感應器相關功能是由CoreMotion提供;指南針、定位資訊相關功能由CoreLocation提供。
CoreMotion
在CoreMotion.framework中,有下面這些類:
1234567 |
CMAccelerometerDataCMAttitudeCMDeviceMotionCMGyroDataCMLogItemCMMagnetometerDataCMMotionManager
|
每個是做什麼的,可以在官方文檔中閱讀,就不在這翻譯了。其中實現對裝置加速度的識別,主要是使用CMMotionManager。
CMMotionManager
如何使用CMMotionManager?
Step1:產生一個CMMotionManager的執行個體mManager。
Step2:執行個體使用方法isAccelerometerAvailable判斷加速度感應器是否可用。
Step3:如果可用,則通過方法setAccelerometerUpdateInterval設定採樣頻率。
Step4:最後使用startAccelerometerUpdatesToQueue:withHandler開始採樣及對採樣進行處理。
範例程式碼
我在下面的代碼中,實現了一個小球在一個框中運動,運動的軌跡是根據手機的傾斜角度計算,運動的方向同傾斜的角度一致,並且傾斜角度越大運動速度越快。 代碼下載 在代碼的實現過程中,對view的層次有了更深的體會。此外,在給label供數的時候,發現剛好使用代理的方式,算是也對代理做了聯絡。
編碼過程中遇到七七八八問題的記錄Code Sign error:
著手時,借鑒了這個代碼,在編譯時間遇到了這個問題:
Code Sign error: The identity ‘iPhone Developer: Haomian Wang (33P29785DD)‘ doesn‘t match any valid certificate/private key pair in the default keychain
原因:
CodeSigning簽署的不是你的provisioning,沒法在真機上使用。
解決辦法:
在TARGETS中的Build Settings裡,找Code Signing Identity,裡面把不是自己的developer改成自己的provisioning。
註:
借鑒的這份代碼是使用acceleroImeter:didAccelerate方法來處理撲捉到的加速度資訊,但這個方法已經在iOS5廢棄了,現在都使用CoreMotion架構來實現。
未添加CoreMotion.framework
編譯自己代碼時,首先出現了如下錯誤:
原因:
原因是代碼中使用了CoreMotion,但工程中沒有添加CoreMotion.framework。這很常見:在使用CoreLocation等framework時,也要想著在工程中添加framework。
解決辦法: 在處添加CoreMotion.framework
給工程改名字導致編譯不過
這是個題外話,當時想給工程改個名字,結果改了之後,編譯不過。 原因:
原因都是名字、路徑更改導致的找不到檔案。
解決辦法:
改名字注意三點:
- 修改了Project的名字後,Xcode會提示你一些其他地方也需要修改,你就按著提示修改;
- 也修改本地檔案夾的名字後,注意xcode工程中的檔案清單檔案名稱是否會變為紅色,如果是紅色,需要你再想辦法重新加一下路徑;
- 工程中的BuildSettings,這裡最好搜一下你原來的名字,變更。我遇到的編譯不過都是這裡的路徑還保留著原來的名字,未作更改。
iOS感應器的使用