Из этого SO вопроса Как я могу определить, когда кто-то трясет iPhone? Основной трюк в том, что вам нужен UIView (не контроллер просмотра), который вы хотите использовать в качестве firstResponder для получения сообщений о событиях встряхивания.,Вот код, который вы можете использовать в любом UIView для получения событий встряски:
@implementation ShakingView
- (void)motionEnded:(UIEventSubtype)motion withEvent:(UIEvent *)event
{
if ( event.subtype == UIEventSubtypeMotionShake )
{
// Put in code here to handle shake
}
if ( [super respondsToSelector:@selector(motionEnded:withEvent:)] )
[super motionEnded:motion withEvent:event];
}
- (BOOL)canBecomeFirstResponder
{ return YES; }
@end
Вы можете легко преобразовать любой UIView (даже системные представления) в представление, которое может получить событие встряски, просто подклассировав представление столько эти методы (и затем выбор этого нового типа вместо базового типа в IB или использование его при выделении представления).
В контроллере представления вы хотите установить это представление, чтобы стать первым респондентом:
- (void) viewWillAppear:(BOOL)animated
{
[shakeView becomeFirstResponder];
[super viewWillAppear:animated];
}
- (void) viewWillDisappear:(BOOL)animated
{
[shakeView resignFirstResponder];
[super viewWillDisappear:animated];
}
Не забывайте, что если у вас есть другие представления, которые становятся первыми респондентами от действий пользователя (например, панель поиска или поле ввода текста), вам также необходимо восстановить статус первого респондента дрожащего представления, когдадругое представление уходит в отставку!
Этот метод работает, даже если для applicationSupportsShakeToEdit задано значение NO.