2009-08-27 16 views
6

Próbuję zaimplementować "tutorial" na temat wstrząsów na tej stronie, ale myślę, że czegoś brakuje. Skopiowałem jego funkcję przyspieszeniomierza do pliku myAppViewController.m i umieściłem tam kilka wpisów, aby sprawdzić, czy funkcja ta wchodzi nawet w funkcję, gdy używam funkcji "wstrząsania" symulatora. Nic nie pojawia się w konsoli debugowania.jak wykrywać i programować w pobliżu wstrząsów dla iPhone'a

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

Może ktoś wyjaśnić co I może być brakuje? Lub wskazać mi samouczek?

znalazłem to, co wygląda obiecująco, ale nie wiem jak „umieścić go w UIView” How do I detect when someone shakes an iPhone?


EDIT - teraz tu jest mój kod działa, ponieważ sugestii Zaakceptowanych odpowiedź jest.

Oto mój kod do wykrywania gestu drżenia w 3.0 sdk iphone.

-(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

Tak, działa w symulatorze. – Neo42

+0

W rzeczywistości wywoływanie 'staćFirstResponder' jest niepotrzebne. Jedyną czynnością, która jest wymagana, aby kontroler viewController zareagował na zdarzenia związane z ruchem, jest zapewnienie, że viewController może stać się firstResponder. Zgodnie z opisem w dokumencie, UIView przekazuje komunikat 'motionBegan' itd. Do łańcucha responderów, który w końcu znajdzie kontroler widoku, o ile' canBecomeFirstResponder' zwróci wartość YES. –

Odpowiedz

4

Należy absolutnie nie być słuchanie UIAccelerometer bezpośrednio z własnego filtrowania do obsługi zdarzeń trząść. Jest to operacja o dużej mocy i powinna być używana tylko przez aplikacje wymagające dużej częstotliwości próbkowania przyspieszeniomierza. Korzystać z nowych zdarzeń ruchu zamiast które zostały dodane do UIEvent:

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

Podobnie jak akcentami, zdarzenia ruchu zostaną dostarczone do pierwszego odpowiadającego, następnie podróż w górę łańcucha responder jeśli pierwszy responder nie reaguje . Model UIEvent będzie mieć typ UIEventTypeMotion i podtyp UIEventSubtypeMotionShake.

+0

Dziękujemy za odpowiedź 3,0! Zamiast tego spróbuję tego. – Neo42

+0

6 lat później link nie jest już dostępny, ale odpowiedź jest nadal dobra. Oto nowy link: https://developer.apple.com/library/prerelease/ios/documentation/EventHandling/Conceptual/EventHandlingiPhoneOS/motion_event_basics/motion_event_basics.html – Martin

6

Oto moja odpowiedź, że działa:

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

} 

testowałem tylko z symulatora i powraca do mnie:

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

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

Mam nadzieję, że pomoc, ponieważ tracę 2 godziny na wykonanie tej pracy.

+0

+1 za utratę 2 godzin. :) – Jeet