2009-08-27 4 views
6

Estoy tratando de implementar el "tutorial" de sacudidas en esta página, pero creo que me falta algo. Copié su función de acelerómetro en myAppViewController.m file y puse algunos nslogs allí para ver si incluso entra en la función cuando uso la función de simulación de "shake". No aparece nada en la consola de depuración.cómo detectar y programar batidos para el iphone

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

Puede alguien explicar lo que podría hacer falta? ¿O apuntarme a un tutorial?

me encontré con esto, que parece prometedor, pero no sé cómo "lo puso en un UIView" How do I detect when someone shakes an iPhone?


EDITAR - ahora aquí está mi código de trabajo debido a la sugerencia de la respuesta aceptada.

Aquí está mi código para detectar el gesto de agitar en 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

Sí, funciona en el simulador. – Neo42

+0

En realidad, no es necesario llamar a 'becomeFirstResponder'. La única acción que se requiere para permitir que viewController responda a los eventos de movimiento es garantizar que viewController se convierta en firstResponder. Como se describe en el doco, UIView pasa los mensajes 'motionBegan' etc. a la cadena de respuesta, que eventualmente encontrarán el controlador de la vista, siempre que' canBecomeFirstResponder' devuelva SÍ. –

Respuesta

4

Debe absolutamente no estar escuchando a UIAccelerometer directamente con su propia filtrado para controlar los eventos de agitación. Esa es una operación de alta potencia y solo debe ser utilizada por aplicaciones que necesitan una alta velocidad de muestreo del acelerómetro. Utilizar los nuevos eventos de movimiento en lugar de la que se han añadido a UIEvent:

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

Al igual que toques, un evento de movimiento serán entregados a la primera respuesta, a continuación, viajar hasta la cadena de respuesta si el primer nivel de respuesta no responde . El UIEvent tendrá el tipo UIEventTypeMotion y el subtipo UIEventSubtypeMotionShake.

+0

¡Gracias por una respuesta 3.0! Voy a intentar esto en su lugar. – Neo42

+0

6 años después, el enlace ya no está disponible, pero la respuesta sigue siendo buena. Aquí está el nuevo enlace: https://developer.apple.com/library/prerelease/ios/documentation/EventHandling/Conceptual/EventHandlingiPhoneOS/motion_event_basics/motion_event_basics.html – Martin

6

aquí está mi respuesta que funciona:

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

} 

Probé solamente con el simulador y me vuelve:

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

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

espero que este ayuda, porque pierdo 2 horas de hacer este trabajo.

+0

+1 por perder 2 horas. :) – Jeet

Cuestiones relacionadas