web-dev-qa-db-fra.com

iOS: Comment détecter le mouvement Shake?

J'ai ajouté le code suivant à mon appDelegate.m

- (void)motionBegan:(UIEventSubtype)motion withEvent:(UIEvent *)event
{
}

- (void)motionEnded:(UIEventSubtype)motion withEvent:(UIEvent *)event
{
    if (motion == UIEventSubtypeMotionShake )
    {
        // User was shaking the device. Post a notification named "shake".
        [[NSNotificationCenter defaultCenter] postNotificationName:@"shake" object:self];
    }
}

- (void)motionCancelled:(UIEventSubtype)motion withEvent:(UIEvent *)event
{   
}

- (void)shakeSuccess
{
    // do something...
}

puis j'ai ajouté:

- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions
{
    // Override point for customization after application launch.
    // INIT THE BACKGROUND PATH STRING

    [self refreshFields];
    [self.window addSubview:navController.view];
    [self.window makeKeyAndVisible];
    ***[[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(shakeSuccess) name:@"shake" object:nil];***

    return YES;
}

Lorsque je démarre mon application sur mon iPhone, la méthode nommée "shakeSuccess" n'est pas appelée. Que dois-je faire pour implémenter cette fonction dans mon application? une idée?

24
Samblg

Cela pourrait vous aider ...
https://stackoverflow.com/a/2405692/7961

Il dit que vous devez définir UIApplication's applicationSupportsShakeToEdit sur YES. et remplacer 3 méthodes dans votre VC:

-(BOOL)canBecomeFirstResponder {
    return YES;
}

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

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

Le reste de votre code est très bien. (les -motionEnded:withEvent:)

59
Christian Schnorr

Vous pourriez faire quelque chose comme ça ...

D'abord...

Définissez la propriété applicationSupportsShakeToEdit dans le délégué de l'application:

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

    application.applicationSupportsShakeToEdit = YES;

    [window addSubview:viewController.view];
    [window makeKeyAndVisible];
}

Deuxièmement...

Ajouter/Remplacer les méthodes canBecomeFirstResponder, viewDidAppear: et viewWillDisappear: dans votre View Controller:

-(BOOL)canBecomeFirstResponder {
    return YES;
}

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

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

Troisièmement...

Ajoutez la méthode motionEnded à votre View Controller:

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

Cela devrait fonctionner si la première réponse ne fonctionnait pas et ce n'est que rapidement tapé non testé :)

26
Thomas Stone

Si vous souhaitez être en mesure de détecter le mouvement de tremblement dans l'application, la meilleure façon est de remplacer la classe de votre application par une classe personnalisée.

Et puis implémentez cela dans votre classe d'application personnalisée

@implementation PSApplication

- (void)sendEvent:(UIEvent *)event
{
    if ( event.type == UIEventTypeMotion && event.subtype == UIEventSubtypeMotionShake ) {
        [[NSNotificationCenter defaultCenter] postNotificationName:@"shakeNotification" object:nil];
    }

    [super sendEvent:event];
}

@end
14
Cherpak Evgeny

J'ai étendu la classe UIApplication et ajouté la référence de classe à main: MyApplication.h

@interface MyApplication : UIApplication

@end

MyApplication.m

@implementation MyApplication

- (void) sendEvent:(UIEvent *)event
{
    if( event && (event.subtype==UIEventSubtypeMotionShake))
    {
        AppDelegate *objAppDelegate = (AppDelegate *)[UIApplication sharedApplication].delegate;

        [objAppDelegate doWhatEver];
        [super sendEvent:event];
    }
    else
    {
        [super sendEvent:event];
    }
}

@end

Et la dernière étape de main.m

int main(int argc, char *argv[])
{
return UIApplicationMain(argc, argv, NSStringFromClass([MyApplication class]), NSStringFromClass([AppDelegate class]));
}

Cela fonctionne dans tous les cas.

3
Harit K