Цель C: Проблемы с встряхиванием

Я обнаруживаю встряску, которая запускает анимацию, а когда она заканчивается, анимация прекращается. Иногда это работает, но иногда он не понимает, что встряска закончилась, поэтому он никогда не вызовет метод motionEnded. У кого еще возникла эта проблема? Решения?

-(BOOL)canBecomeFirstResponder {
return YES;
}

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

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

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

-(void)motionBegan:(UIEventSubtype)motion withEvent:(UIEvent *)event
{
if (event.type == UIEventSubtypeMotionShake )
{
    NSLog(@"1");
    [img startAnimating];
}
}

-(void)motionEnded:(UIEventSubtype)motion withEvent:(UIEvent *)event
{
if (event.type == UIEventSubtypeMotionShake )
{
    NSLog(@"3");
    [img stopAnimating];
}
}

person Chris    schedule 27.01.2011    source источник


Ответы (1)


Apple, похоже, обсуждает «несогласованность», с которой вы столкнулись здесь: http://developer.apple.com/library/ios/#documentation/EventHandling/Conceptual/EventHandlingiPhoneOS/MotionEvents/MotionEvents.html

В листинге 4-2 написано:

... Однако есть одно важное различие между событиями касания и событиями встряхивания. Когда пользователь начинает встряхивать устройство, система отправляет событие движения первому ответчику в сообщении motionBegan:withEvent:; если первый респондент не обрабатывает событие, оно перемещается вверх по цепочке респондентов. Если тряска длится меньше секунды или около того, система отправляет сообщение motionEnded:withEvent: первому ответившему. Но если тряска длится дольше или если система определяет, что движение не является тряской, первый ответивший получает сообщение motionCancelled:withEvent:.

Я бы предложил добавить обратный вызов motionCancelled:withEvent, чтобы увидеть, происходит ли это в тех случаях, когда вы не получаете вызов motionEnded.

person Tydeology    schedule 01.02.2011