2009-08-27 10 views
6

私はこのページで揺れの「チュートリアル」を実装しようとしていますが、何か不足していると思います。私は彼の加速度計機能をmyAppViewController.mファイルにコピーし、そこにいくつかのnslogを入れて、シミュレータ "震動"機能を使用するときに機能に入るかどうかを確認します。デバッグコンソールには何も表示されません。iphoneの揺れを検出してプログラムする方法

http://mithin.in/2009/07/28/detecting-a-shake-using-iphone-sdk

誰もが、私は失われるかもしれないものを説明できますか?またはチュートリアルを教えてください。

私は有望に見えるれ、これを見つけたが、私は How do I detect when someone shakes an iPhone?


EDIT「のUIViewにそれを置く」方法がわからない - ので、受け入れ答えの提案で今ここに私の作業コードです。

私のコードは、3.0 iphone sdkの揺れのジェスチャーを検出するためのコードです。

-(BOOL)canBecomeFirstResponder { 
    return YES; 
} 

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

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


- (void)motionEnded:(UIEventSubtype)motion withEvent:(UIEvent *)event { 
    NSLog(@"{motion ended event "); 

    if (motion == UIEventSubtypeMotionShake) { 
     NSLog(@"{shaken state "); 

    } 
    else { 
     NSLog(@"{not shaken state ");  
    } 
} 
+0

はい、シミュレータで動作します。 – Neo42

+0

実際には、 'becomeFirstResponder'を呼び出す必要はありません。 viewControllerがモーションイベントに応答するために必要な唯一のアクションは、viewControllerがfirstResponderになることができるようにすることです。 ドックで説明したように、UIViewは 'motionBegan'などのメッセージをレスポンダチェーンに渡します。これは、' canBecomeFirstResponder'がYESを返す限り、最終的にビューのコントローラを見つけることになります。 –

答えて

4

あなたは絶対には、手ぶれのイベントを処理するために、独自のフィルタリングを直接UIAccelerometerに耳を傾けてはいけません。これはハイパワーの操作であり、高い加速度計のサンプリングレートが必要なアプリケーションでのみ使用してください。 UIEventに追加された代わりに新しいモーションイベントを使用します。

http://developer.apple.com/IPhone/library/documentation/iPhone/Conceptual/iPhoneOSProgrammingGuide/EventHandling/EventHandling.html#//apple_ref/doc/uid/TP40007072-CH9-SW24

ジャストタッチのように、モーションイベントは最初の応答者が応答しない場合、レスポンダチェーンを移動、その後、ファーストレスポンダに配信されます。 UIEventのタイプはUIEventTypeMotion、サブタイプはUIEventSubtypeMotionShakeです。

ここ
+0

3.0のレスポンスありがとう!私は代わりにこれを試してみます。 – Neo42

+0

6年後、リンクはもう利用できなくなりましたが、答えはまだまだです。新しいリンクは次のとおりです:https://developer.apple.com/library/prerelease/ios/documentation/EventHandling/Conceptual/EventHandlingiPhoneOS/motion_event_basics/motion_event_basics.html – Martin

6

の作品私の答えです:

//MainViewController.m

-(void)motionBegan:(UIEventSubtype)motion withEvent:(UIEvent *)event { 

    [[NSNotificationCenter defaultCenter] addObserver:self 
              selector:@selector(shake) 
           name:@"shake" object:nil]; 

    if(event.type == UIEventTypeMotion && event.subtype == UIEventSubtypeMotionShake) 
     NSLog(@"motion Began"); 
} 

-(void)motionEnded:(UIEventSubtype)motion withEvent:(UIEvent *)event { 
    [[NSNotificationCenter defaultCenter] addObserver:self 
              selector:@selector(shake) 
               name:@"shake" 
               object:nil]; 
    if(event.type == UIEventTypeMotion && event.subtype == UIEventSubtypeMotionShake) 
     NSLog(@"motion Ended"); 
} 

-(void)motionCancelled:(UIEventSubtype)motion withEvent:(UIEvent *)event { 
    [[NSNotificationCenter defaultCenter] addObserver:self 
              selector:@selector(shake) 
               name:@"shake" 
               object:nil]; 
    if(event.type == UIEventTypeMotion && event.subtype == UIEventSubtypeMotionShake) 
     NSLog(@"motion Cancelled"); 
} 

-(void)viewDidLoad { 
    [super viewDidLoad]; 

    [self becomeFirstResponder]; 
} 

- (void)viewDidUnload { 
    // Release any retained subviews of the main view. 
    // e.g. self.myOutlet = nil; 
    [self resignFirstResponder]; 

} 

私はシミュレータでのみテストされ、それが私を返します。

2010-06-22 12:40:48.799 Cocktails[14589:207] motion Began 

2010-06-22 12:40:48.800 Cocktails[14589:207] motion Ended 

私はこのことを願っています助けてください。私はこの仕事を2時間ほどやっているからです。

+0

+1 2時間の紛失。 :) – Jeet

関連する問題