6

このページのシェイク「チュートリアル」を実装しようとしていますが、何かが足りないと思います。彼の加速度計関数を myAppViewController.m ファイルにコピーし、そこにいくつかの nslog を入れて、シミュレーターの「シェイク」関数を使用したときに関数に入るかどうかを確認しました。デバッグ コンソールには何も表示されません。

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

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

これは有望に見えますが、「UIView に入れる」方法がわかりません 。誰かが iPhone を振ったことを検出するにはどうすればよいですか?


編集 - 受け入れられた回答の提案により、ここに私の作業コードがあります。

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 ");       
    }
}
4

2 に答える 2

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時間失うので、この助けを願っています。

于 2010-06-22T09:55:44.637 に答える
4

シェイク イベントを処理するために、独自のフィルタリングを使用して直接リッスンしないでください。UIAccelerometerこれは高電力の操作であり、高い加速度計のサンプリング レートを必要とするアプリでのみ使用する必要があります。に追加された新しいモーション イベントを代わりに使用しますUIEvent

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

タッチと同様に、モーション イベントがファーストレスポンダーに配信され、ファーストレスポンダーが応答しない場合は、レスポンダー チェーンを上に移動します。にはUIEventtypeUIEventTypeMotionと subtypeがありUIEventSubtypeMotionShakeます。

于 2009-08-29T19:25:07.110 に答える