在摇动iPhone时检测

时间:2009-12-07 14:35:45

标签: iphone objective-c

我对此前发布的震动检测有疑问, 这是一个提醒:

“现在......我想做类似的事情(在iPhone OS 3.0+中),只是在我的情况下,我想在应用程序范围内,所以当发生震动时我可以提醒应用程序的各个部分。这就是我结束的做起来。

首先,我将UIWindow子类化。这很容易。使用MotionWindow:UIWindow等界面创建一个新的类文件(随意选择自己的,natch)。添加如下方法:

- (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. 我怎么知道震动事件是否已经“已经在进行中”?
  5. 感谢。

1 个答案:

答案 0 :(得分:6)

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形式的对象中使用。