как обнаружить и запрограммировать тряски для iphone - PullRequest
6 голосов
/ 27 августа 2009

Я пытаюсь реализовать «учебник» встряски на этой странице, но я думаю, что что-то упустил. Я скопировал его функцию акселерометра в файл myAppViewController.m и поместил туда несколько nslogs, чтобы посмотреть, попадет ли он даже в функцию, когда я использую функцию «встряхивания» на тренажерах. В консоли отладки ничего не отображается.

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

Может кто-нибудь объяснить, чего мне не хватает? Или указать мне учебник?

Я нашел это, что выглядит многообещающе, но я не знаю, как «поместить это в UIView» Как определить, когда кто-то трясет iPhone?


РЕДАКТИРОВАТЬ - теперь вот мой рабочий код из-за принятого предложения ответа.

Вот мой код для определения жеста встряхивания в 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 ");       
    }
}

Ответы [ 2 ]

6 голосов
/ 22 июня 2010

Вот мой ответ, который работает:

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

}

Я тестировал только с симулятором, и он возвращает меня:

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

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

Я надеюсь, что это поможет, потому что я потерял 2 часа на выполнение этой работы.

4 голосов
/ 29 августа 2009

Вы должны абсолютно не слушать UIAccelerometer напрямую с вашей собственной фильтрацией для обработки событий встряхивания. Это операция с высокой мощностью и должна использоваться только приложениями, которым требуется высокая частота дискретизации акселерометра. Вместо этого используйте новые события движения, которые были добавлены к UIEvent:

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

Так же, как касания, событие движения будет доставлено первому респонденту, а затем по цепочке респондентов перемещаться вверх, если первый респондент не отвечает. UIEvent будет иметь тип UIEventTypeMotion и подтип UIEventSubtypeMotionShake.

...