12

簡単な質問があります。ユーザーがiPhoneを振ったときを検出しようとしています。モーションを検出するための標準コードが用意されていますが、これは問題なく機能します。ただし、実際の電話でこれをテストしたところ、モーション検出をトリガーするには、デバイスをかなり強く振る必要があることがわかりました. 感度チェックのレベルを実装する方法があるかどうか知りたいです。たとえば、ユーザーがデバイスを軽く振ったかどうか、または軽い揺れと強い揺れの間のどこかを検出する方法です。これは iOS 7 を対象としているため、古い iOS バージョンで廃止されていないヒントやアドバイスをいただければ幸いです。私はグーグルで調べましたが、この問題に対する良い解決策をまだ見つけていません (もしあれば)。

ありがとう!

-(void)motionEnded:(UIEventSubtype)motion withEvent:(UIEvent *)event
{
    if(motion == UIEventSubtypeMotionShake)
    {
       //Detected motion, do something about it 
       //at this point.
    }
}

-(BOOL)canBecomeFirstResponder
{
    return YES;
}

-(void)viewDidAppear:(BOOL)animated
{
    [super viewDidAppear:animated];
    [self becomeFirstResponder];
}

-(void)viewWillDisappear:(BOOL)animated
{
    [self resignFirstResponder];
    [super viewWillDisappear:animated];
}
4

4 に答える 4

18

これが私が見つけた解決策です。これはうまく機能しますが、deviceMotionUpdateInterval の時間値と、accelerationThreshold をいじる必要があります。これは、実際の「軽い揺れ」と「電話を手に取って顔に近づける」などの微妙なバランスを取るのが難しい場合があります。 ..." もっと良い方法があるかもしれませんが、ここから始めましょう。ビュー didLoad 内で、次のようなことを行いました。

#import <CoreMotion/CoreMotion.h> //do not forget to link the CoreMotion framework to your project
#define accelerationThreshold  0.30 // or whatever is appropriate - play around with different values

-(void)viewDidLoad
{
      CMMotionManager *motionManager; 

      motionManager = [[CMMotionManager alloc] init];
      motionManager.deviceMotionUpdateInterval = 1;

      [motionManager startDeviceMotionUpdatesToQueue:[NSOperationQueue currentQueue]  withHandler:^(CMDeviceMotion *motion, NSError *error)
             {
                [self motionMethod:motion];
             }];
}

-(void)motionMethod:(CMDeviceMotion *)deviceMotion
{
    CMAcceleration userAcceleration = deviceMotion.userAcceleration;
    if (fabs(userAcceleration.x) > accelerationThreshold
        || fabs(userAcceleration.y) > accelerationThreshold
        || fabs(userAcceleration.z) > accelerationThreshold)
        {
           //Motion detected, handle it with method calls or additional
           //logic here.
           [self foo];
        }
}
于 2013-10-13T07:28:49.113 に答える
6

コアモーションを使用します。バイナリを CoreMotion フレームワークにリンクします。クラスに #import を含めます。CMMotionManager のインスタンスを作成します。deviceMotionUpdateInterval プロパティを適切な値に設定します。次に、startDeviceMotionUpdatesToQueue を呼び出します。加速度、磁場、回転などを含むブロック内の継続的な更新を取得します。必要なデータを取得します。注意すべきことの 1 つは、間隔が小さすぎると更新が非常に速くなるため、同じ処理を行う適切なロジックを採用する必要があることです。

于 2013-10-11T06:16:45.537 に答える