如何配置我的应用以检测​​摇动事件?

时间:2012-09-07 09:11:04

标签: ios uinavigationcontroller motion-detection

因此,让我首先澄清一下我已经实施了哪些代码

-(BOOL)canBecomeFirstResponder 
{
    return YES;
}

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

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

- (void)viewWillDisappear:(BOOL)animated 
{
    [self resignFirstResponder];
    [super viewWillDisappear:animated];
}

- (void)motionBegan:(UIEventSubtype)motion withEvent:(UIEvent *)event
{
    if (motion == UIEventSubtypeMotionShake)
    {
        NSLog(@"FUUU");
    }
}

- (void)motionEnded:(UIEventSubtype)motion withEvent:(UIEvent *)event
{
    if (motion == UIEventSubtypeMotionShake)
    {
        NSLog(@"FUUU");
    }
}

这都在UIViewController类

并在- (void) applicationDidFinishLaunching:(UIApplication*)application中设置了

[application setApplicationSupportsShakeToEdit:YES];

然而它没有做任何事情,也没有检测到任何单一动作。我不知道还能做什么。这似乎对许多其他人有用,所以我很困惑为什么我与众不同......难道是因为它是通过UINavigationController吗?或者因为我通过plist加载主应用程序,我的主要看起来像

retVal = UIApplicationMain(argc, argv, nil, nil);

我非常难过。

3 个答案:

答案 0 :(得分:3)

为了检测摇动手势,你需要子类化UIView并实现以下方法(不要在UIViewController上实现这些方法):

  • (BOOL)canBecomeFirstResponder
  • (void)motionBegan :( UIEventSubtype)motion withEvent:(UIEvent *)event

然后将子类视图添加到UIViewController,并通过调用-becomeFirstResponder使其成为第一个响应者。

答案 1 :(得分:2)

您不需要设置[application setApplicationSupportsShakeToEdit:YES];,因为这是默认值,而iOS仅将此用于Shake to Undo / Redo。

如果要在视图控制器中捕获动作,则需要将此属性设置为NO [application setApplicationSupportsShakeToEdit:NO];并自行处理。

Event Handling Programming Guide中所述。

希望这有帮助。

PS:以防万一,你在viewDidAppear方法中拨错了。这应该是:

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

答案 2 :(得分:0)

谢谢大家的回复,但我最终使用了一种不同的方法,我在app delegate中访问了加速度计,然后通过nsnotification中心发送了一个nsnotifcation到当前显示的ui导航控制器

- (void) accelerometer:(UIAccelerometer *)accelerometer didAccelerate:(UIAcceleration *)acceleration 
{
    [[NSNotificationCenter defaultCenter] postNotificationName:notificationName object:nil userInfo:nil];

}