Во-первых, ответ Кендалла на 10 июля точный.
Теперь ... я хотел сделать что-то подобное (в iPhone OS 3.0+), только в моем случае я хотел, чтобы это было доступно для всего приложения, чтобы я мог предупреждать различные части приложения, когда происходило сотрясение , Вот что я в итоге сделал.
Сначала я вложил в подкласс UIWindow . Это легко peasy. Создайте новый файл класса с интерфейсом, таким как MotionWindow : UIWindow
(не стесняйтесь выбирать свой, естественно). Добавьте метод, например, так:
- (void)motionEnded:(UIEventSubtype)motion withEvent:(UIEvent *)event {
if (event.type == UIEventTypeMotion && event.subtype == UIEventSubtypeMotionShake) {
[[NSNotificationCenter defaultCenter] postNotificationName:@"DeviceShaken" object:self];
}
}
Измените @"DeviceShaken"
на имя уведомления по вашему выбору. Сохраните файл.
Теперь, если вы используете MainWindow.xib (стандартный шаблонный код Xcode), зайдите туда и измените класс вашего объекта Window с UIWindow на MotionWindow или как вы там назвали Это. Сохранить XIB. Если вы установили UIWindow программно, используйте вместо этого новый класс Window.
Теперь ваше приложение использует специализированный класс UIWindow . Везде, где вы хотите получить информацию о встряхивании, подпишитесь на них уведомления! Как это:
[[NSNotificationCenter defaultCenter] addObserver:self
selector:@selector(deviceShaken) name:@"DeviceShaken" object:nil];
Чтобы удалить себя в качестве наблюдателя:
[[NSNotificationCenter defaultCenter] removeObserver:self];
Я поместил свой в viewWillAppear: и viewWillDisappear: , когда это касается контроллеров представления. Убедитесь, что ваш ответ на событие встряхивания знает, «оно уже выполняется» или нет. В противном случае, если устройство дважды встряхнуть подряд, у вас возникнет некоторая пробка. Таким образом, вы можете игнорировать другие уведомления, пока вы действительно не ответите на исходное уведомление.
Также: Вы можете отключить motionBegan против motionEnded . Тебе решать. В моем случае эффект всегда должен иметь место после , когда устройство находится в состоянии покоя (по сравнению с тем, когда оно начинает дрожать), поэтому я использую motionEnded . Попробуйте оба и посмотрите, какой из них имеет больше смысла ... или обнаружите / сообщите обоим!
Еще одно (любопытное?) Замечание: обратите внимание, что в этом коде нет признаков управления первым респондентом. До сих пор я пробовал это только с контроллерами табличного представления, и все, кажется, прекрасно работает вместе! Я не могу поручиться за другие сценарии.
Kendall, et. al - может кто-нибудь говорить, почему это может быть так для UIWindow подклассов? Это потому, что окно находится наверху пищевой цепи?