how to detect and program around shakes for the iphone

后端 未结 2 941
盖世英雄少女心
盖世英雄少女心 2020-12-16 04:59

I\'m trying to implement the shake \"tutorial\" on this page, but I think I\'m missing something. I copied his accelerometer function into myAppViewController.m file and pu

相关标签:
2条回答
  • 2020-12-16 05:40

    You should absolutely not be listening to UIAccelerometer directly with your own filtering to handle shake events. That is a high-power operation and should only be used by apps that need a high accelerometer sampling rate. Use the new motion events instead which have been added to UIEvent:

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

    Just like touches, a motion event will be delivered to the first responder, then travel up the responder chain if the first responder does not respond. The UIEvent will have type UIEventTypeMotion and subtype UIEventSubtypeMotionShake.

    0 讨论(0)
  • 2020-12-16 05:44

    Here is my answer that works:

    //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]; 
    
    }
    

    I tested only with simulator and it returns me:

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

    I hope this help, because I loose 2 hours of doing this work.

    0 讨论(0)
提交回复
热议问题