2011-05-18 18 views
11

En la sacudida del dispositivo iPhone Quiero un poco de función llamado, no sé cómo reconocer sacudir así que traté de algún tipo de relación y trató este códigoCómo detectar el movimiento sacudida en iPhone

 
- (void)motionBegan:(UIEventSubtype)motion withEvent:(UIEvent *)event 
{ 
    if(event.type == UIEventSubtypeMotionShake) 
    { 
     NSLog(@"called"); 
     [self.view setBackgroundColor:[UIColor greenColor]]; 
    } 
} 

- (BOOL)canBecomeFirstResponder 
{ 
return YES; 
} 

Pero, por desgracia sin suerte por lo que puede usted por favor hágamelo saber cómo puedo hacer lo mismo

Gracias y Saludos

+0

¿Dónde ha intentado que el código? – Vladimir

+0

en el archivo de subclase del controlador uiview – Radix

+0

@Radix, lo usé en la subclase UIWindow y usé NSNotification para notifity otros controladores en el evento shake. Usar ese código en la subclase UICOntroller tampoco funcionó para mí si recuerdo correctamente – Vladimir

Respuesta

30

De acuerdo con los comentarios anteriores discutido estoy respondiendo a mi pregunta para que otros puedan leer la solución que he conseguido

En la documentación de la clase UIResponder se dice que los eventos de movimiento responderán al primer nivel de respuesta única por lo que lo que hice fue añadir sólo una pequeña función y que hizo el truco para mí, así que aquí está mi solución

 
- (void)motionBegan:(UIEventSubtype)motion withEvent:(UIEvent *)event 
{ 
    if(event.type == UIEventSubtypeMotionShake) 
    { 
     NSLog(@"called"); 
     [self.view setBackgroundColor:[UIColor greenColor]]; 
    } 
} 

- (BOOL)canBecomeFirstResponder 
{ 
return YES; 
} 

Ahora todavía no era capaz de detectar cualquier movimiento de batido así que todo lo que tenía que hacer era hacer mi viewcontroller el primer nivel de respuesta y por eso aquí está el código que he utilizado

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

y yo estaba hecho

Ésta fue la solución que se me ocurrió con

Gracias y Saludos

+0

funcionó para mí. aclamaciones. –

+0

¡Gracias! ¡Trabajado como un encanto! – atomikpanda

+0

Fantástico, gracias :) – mondousage

1

Se podría hacer algo como esto ...

En primer lugar ...

Establecer la propiedad applicationSupportsShakeToEdit en el delegado de la aplicación:

- (void)applicationDidFinishLaunching:(UIApplication *)application { 

    application.applicationSupportsShakeToEdit = YES; 

    [window addSubview:viewController.view]; 
    [window makeKeyAndVisible]; 
} 
En segundo lugar

...

Agregar/Reemplazar canBecomeFirstResponder, viewDidAppear: viewWillDisappear y métodos: en el controlador de vista:

-(BOOL)canBecomeFirstResponder { 
    return YES; 
} 

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

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

En tercer lugar ...

Añadir el método de motionEnded su Controlador de Vista:

- (void)motionEnded:(UIEventSubtype)motion withEvent:(UIEvent *)event 
{ 
    if (motion == UIEventSubtypeMotionShake) 
    { 
    // your code 
    } 
} 

Eso debería funcionar si la primera respuesta no y esto solo se escribe rápidamente no probado :)

0

Para manejar globalmente el movimiento en todas las pantallas de su aplicación, puede subclase UIWindow e implementar motionEnded, ya que el evento se disparará la cadena de respuesta hasta que llegue al objeto ventana. Ejemplo usando Xamarin:

public class MyWindow : UIWindow 
{ 
    public MyWindow(CoreGraphics.CGRect frame) 
     : base (frame) 
    { } 

    public override void MotionEnded (UIEventSubtype motion, UIEvent evt) 
    { 
     if (motion == UIEventSubtype.MotionShake) { 
      Console.WriteLine ("Shake received"); 
     } 
    } 
} 

A continuación, en AppDelegate, poner en práctica el método de la ventana para devolver una instancia de la subclase UIWindow.Ejemplo de uso de Xamarin:

public class AppDelegate : UIApplicationDelegate 
{ 
    UIWindow _window; 

    public override UIWindow Window 
    { 
     get 
     { 
      if (_window == null) { 
       _window = new MyWindow (UIScreen.MainScreen.Bounds); 
      } 

      return _window; 
     } 
     set 
     { 
     } 
    } 

    // ... 
} 

Voilà, shake se maneja en toda la aplicación.

0

Las cosas se vuelven más fáciles con SSEventListener. ¡Su controlador de vista ya no necesita sobrescribir motionEnded:withEvent:! Con SSEventListener, puede detector del evento sacudida tan simple como esto:

[viewController ss_setShakeEventListener:^{ ... }];

Cuestiones relacionadas