определить, когда встряхивает iPhone - PullRequest
2 голосов
/ 07 декабря 2009

У меня есть вопросы, касающиеся обнаружения сотрясений, которые были опубликованы здесь ранее, вот напоминание:

"Теперь ... Я хотел сделать что-то подобное (в 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];
    }
}

Теперь, если вы используете 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];

Вопросы:

  1. где разместить уведомления (у меня есть приложение на основе просмотра)?
  2. Должен ли я удалить себя как наблюдателя, что это значит?
  3. что такое оператор if, который я использую, чтобы проверить, начислялся ли коктейль?
  4. как я могу узнать, что событие Shake знает, что оно "уже в процессе"?

спасибо.

1 Ответ

6 голосов
/ 07 декабря 2009

В iPhone OS 3.x просто получать события движения из любого представления, которое установлено как первый респондент.

В представлении класса вы переопределяете метод motionEnded:, например:

- (void)motionEnded:(UIEventSubtype)motion withEvent:(UIEvent *)event
{
    if(motion == UIEventSubtypeMotionShake && [self isViewLoaded])
    {
        //handle shake here...
    }
}

Кроме того, вам нужно стать Первым ответчиком , когда представление загружено и появляется:

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

    //any extra set up code...
}

Возможно, вам также придется ответить на метод canBecomeFirstResponder.

- (BOOL)canBecomeFirstResponder 
{ 
    return YES; 
}

Они могут использоваться в любом объекте, который наследует форму UIView.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...