en

hi, it seems you are using microsoft internet explorer. it doesn't match web standard and causes problems browsing this site. please please please use mozilla firefox or google chrome instead. thank you!

zh

哦哦!您正在使用Internet Explorer 瀏覽器,它與我們的網頁標準並不相容,可能會導致畫面顯示不正常。
請改用 Mozilla Firefox 或者 Google Chrome 才能正常瀏覽本網站,謝謝!

11.22.2010

Accelerometer / 加速器 / 重力控制器 / 水平儀的基本使用方法

 

Accelerometer Sensor 感應器的基本使用方法,首先必須先在 ViewCotroller.h 中設定代理。設定代理之後才能正常使設定與取得 Accelerometer Sensor 的相關參數,其程式碼如下所示。(View-based Template)

@interface AccelerometerViewController : UIViewController <UIAccelerometerDelegate> {
首先設定 Accelerometer Sensor 的偵測頻率。

- (void)viewDidLoad {
    [super viewDidLoad];

    UIAccelerometer *theAccel = [UIAccelerometer sharedAccelerometer];

    //設定偵測頻率每秒10次
    theAccel.updateInterval = 1.0f/10.0f;

    //設定委派對象給自己(ViewController)
    theAccel.delegate = self;
}

接下來從 Accelerometer Sensor 中取得相關參數。

//啟用Accelerometer Sensor
- (void) accelerometer:(UIAccelerometer *) meter didAccelerate: (UIAcceleration *) accel {

    //將Accelerometer Sensor XYZ軸的數值正規化之後傳至的Label上
    xLabel.text = [NSString stringWithFormat:@"%8f", accel.x];
    yLabel.text = [NSString stringWithFormat:@"%8f", accel.y];
    zLabel.text = [NSString stringWithFormat:@"%8f", accel.z];

    //將Accelerometer Sensor XYZ軸的數值正規化後傳至Progress View上
    xAxis.progress = ABS(accel.x);
    yAxis.progress = ABS(accel.y);
    zAxis.progress = ABS(accel.z);

程式碼到這裡已經可以取得 Accelerometer Sensor X、Y、Z 軸的數值。下列程式碼將利用 iOS SDK 內建的功能取得 Device 目前的擺設狀況。

    //宣告一個UIDevice指標,並取得目前Device的狀況
    UIDevice *device = [UIDevice currentDevice] ;

    //取得當前Device的方向,來當作判斷敘述。(Device的方向型態為Integer)
    switch (device.orientation) {
        case UIDeviceOrientationFaceUp:
            orientationLabel.text = @"螢幕朝上平躺";
            break;

        case UIDeviceOrientationFaceDown:
            orientationLabel.text = @"螢幕朝下平躺";
            break;

        //系統無法判斷目前Device的方向,有可能是斜置
        case UIDeviceOrientationUnknown:
            orientationLabel.text = @"未知方向";
            break;

        case UIDeviceOrientationLandscapeLeft:
            orientationLabel.text = @"螢幕向左橫置";
            break;

        case UIDeviceOrientationLandscapeRight:
            orientationLabel.text = @"螢幕向右橫置";
            break;

        case UIDeviceOrientationPortrait:
            orientationLabel.text = @"螢幕直立";
            break;

        case UIDeviceOrientationPortraitUpsideDown:
            orientationLabel.text = @"螢幕直立,上下顛倒";
            break;

        default:
            orientationLabel.text = @"無法辨識";
            break;
    }

}






8 則留言:

  1. 匿名3/11/2012

    請問一定要繼承UIViewController嗎?
    如果說只是繼承NSObject可以嗎?

    回覆刪除
  2. 當然可以,主要是要在類別加上採納協定的名稱 ,你才有辦法在該類別內實作感應器的方法,上述範例只有 UIViewController 類別,並沒有衍生其他新的類別,所以只好寫在這邊,造成您的誤會不好意思。

    回覆刪除
  3. 請問一下
    當ipad裝置鎖定螢幕方向時
    就無法感應到目前裝置方向

    而變成只有 直、橫

    那在xcode中有辦法得知 使用者目前有沒有鎖定方向嗎?

    回覆刪除
    回覆
    1. 目前沒也看相關的偵測方式,因為他是針對整個硬體做鎖定,並非只有單單一個應用程式,

      你可以試著使用 UIInterfaceOrientation 來判斷畫面的方向,如果 Accelerometer Sensor 改變,但是方向沒變就判定為鎖著。

      另外, [[UIDevice currentDevice] orientation] 也可以得到目前裝置的方向...

      詳見(Constants):https://developer.apple.com/library/ios/#documentation/UIKit/Reference/UIApplication_Class/Reference/Reference.html

      刪除
    2. 另外,你可以試試看使用
      - (BOOL)shouldAutorotateToInterfaceOrientation:(UIInterfaceOrientation)interfaceOrientation

      也可以幫助做判斷

      刪除
  4. 匿名5/17/2013

    板主你好, 我想要讓程式在進入background mode之後還是可以接收accelerometer資料.
    看了很多國外的網頁都沒有很懂. 想請教板主有沒有這方面的經驗可以分享? 謝謝!

    回覆刪除
    回覆
    1. 您好:

      可能沒有辦法這樣做喔,你可以參考這篇「偵測 Device 是否支援多工或背景執行的方法」,
      http://furnacedigital.blogspot.tw/2011/02/device_23.html

      在只有三類型能做背景執行,audio、voip、location(音樂、電話或是定位服務),其他的都不支援唷!

      刪除
    2. 匿名5/18/2013

      了解. 謝謝.

      刪除