Думаю, я сделал все, что должен, чтобы обнаружить встряску, но motionEnded:withEvent: никогда не звонит. (Одна проблема в том, что у меня нет UIViewController - мое приложение основано на шаблоне "OpenGL ES App".)
Я добавил application.applicationSupportsShakeToEdit = YES; в свой application:didFinishLaunchingWithOptions:, и
- (BOOL)canBecomeFirstResponder { return YES; }
на EAGLView.m (который вызывается) и от [self becomeFirstResponder]; до initWithCoder: (и пробовали также разные другие места).
Но отладчик никогда не попадает
- (void)motionEnded:(UIEventSubtype)motion withEvent:(UIEvent *)event
Я пропустил какой-то шаг? Мне нужен контроллер?
(Я использую iOS 3.2 в симуляторе iPad.)
Ответ 2 · рейтинг 3 · BadPirate
То, как цепочка UIResponder работает с уведомлением о встряхивании, неприятно. Кажется, что UIWindow всегда получает уведомление, а затем вспомогательные ответчики могут или не могут в зависимости от того, что находится над ними в цепочке. Я создал подкласс UIWindow и определил его как свой класс окна следующим образом:
- (void)motionEnded:(UIEventSubtype)motion withEvent:(UIEvent *)event
{
if (event.type == UIEventSubtypeMotionShake)
[[NSNotificationCenter defaultCenter] postNotificationName:@"UIEventSubtypeMotionShakeEnded" object:nil];
}
Затем для любых представлений, которые хотели получать уведомления о встряхивании, я просто заставлял их добавлять себя в качестве наблюдателей к событию UIEventSubtypeMotionShakeEnded, и они получали его каждый раз.
[[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(shakeNotification:)
name:@"UIEventSubtypeMotionShakeEnded" object:nil];