5

電話が2秒間静止しているときにアクションを実行したいと思います。私はグーグルとスタックオーバーフローの周りの年齢を検索しました。「Accelerometer DidAccelerate」が減価償却され、CoreMotion が代替品であることを発見しました。私が見たものはすべて「揺れる」動きに関係していました。アップルのドキュメントを読んでみましたが、混乱するだけです!

基本的には、電話の g フォースが一定時間 (電話がテーブルか何かの上に置かれていることを示唆する) 小さい制限内にとどまっていることをアプリに検出させ、それを呼び出してインスタンス化する必要があります。またはアプリに何かをさせます。

どんな助けでも大歓迎です。

4

2 に答える 2

4

次のようなことができます。

CMMotionManager *mManager = [[CMMotionManager alloc] init];

if ([mManager isAccelerometerAvailable] == YES) {
    __block float lastActivityBefore = 0.0;
    [mManager setAccelerometerUpdateInterval:0.1];
    [mManager startAccelerometerUpdatesToQueue:[NSOperationQueue mainQueue] withHandler:^(CMAccelerometerData *accelerometerData, NSError *error) {

        double totalAcceleration = sqrt(accelerometerData.acceleration.x * accelerometerData.acceleration.x + accelerometerData.acceleration.y * accelerometerData.acceleration.y + accelerometerData.acceleration.z * accelerometerData.acceleration.z);
        if(totalAcceleration < SOME_LIMIT)
            lastActivityBefore = lastActivityBefore + 0.1;
        else
            lastActivityBefore = 0.0;

        if(lastActivityBefore >= 2.0)
        {
            //do something
        }
    }];
}

加速度計は、デバイスが安定していても最小限の加速度を示すため、SOME_LIMIT 値を決定するためにテストを行う必要があります。

また、アプリには CMMotionManager クラスのインスタンスを 1 つだけ持つ必要があるため、AppDelegate に配置して 1 回だけ初期化することをお勧めします。

于 2013-05-29T12:31:15.727 に答える