Подтвердить что ты не робот

IOS: Как определить движение дрожания?

Я добавил следующий код в свой 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...
}

а затем я добавил:

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

Когда я запускаю свое приложение на своем iPhone, метод с именем "shakeSuccess" не вызывается. Что делать, чтобы реализовать эту функцию в моем приложении? любая идея?

4b9b3361

Ответ 1

Это может помочь вам... fooobar.com/questions/19246/...

Он говорит, что вы должны установить UIApplication applicationSupportsShakeToEdit на YES. и переопределить 3 метода в вашем VC:

-(BOOL)canBecomeFirstResponder {
    return YES;
}

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

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

Остальная часть вашего кода в порядке. (-motionEnded:withEvent:)

Ответ 2

Вы можете сделать что-то вроде этого...

Во-первых,...

Задайте свойство applicationSupportsShakeToEdit в делетете приложения:

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

    application.applicationSupportsShakeToEdit = YES;

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

Во-вторых...

Добавить/переопределить canBecomeFirstResponder, viewDidAppear: и viewWillDisappear: методы в вашем контроллере просмотра:

-(BOOL)canBecomeFirstResponder {
    return YES;
}

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

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

В-третьих...

Добавьте метод motionEnded в ваш контроллер просмотра:

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

Это должно работать, если первый ответ не был, и это только быстро напечатано не проверено:)

Ответ 3

Если вы хотите обнаружить движение дрожания в приложении, лучший способ - переопределить класс вашего приложения с помощью специального класса.

И затем реализуйте это в своем классе пользовательских приложений

@implementation PSApplication

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

    [super sendEvent:event];
}

@end

Ответ 4

Я расширил класс UIApplication и добавил ссылку на 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

И последний шаг в main.m

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

Это работает во всех случаях.