我对此前发布的震动检测有疑问, 这是一个提醒:
“现在......我想做类似的事情(在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];
的问题:
感谢。
答案 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形式的对象中使用。