【问题标题】:How do I configure my app to detect shake motion events?如何配置我的应用程序以检测抖动运动事件?
【发布时间】:2012-09-07 09:11:04
【问题描述】:

所以让我首先说明一下我已经实现了哪些代码

-(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);

我完全被难住了。

【问题讨论】:

    标签: ios uinavigationcontroller motion-detection


    【解决方案1】:

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

    • (BOOL)可以成为FirstResponder
    • (void)motionBegan:(UIEventSubtype)motion withEvent:(UIEvent *)event

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

    【讨论】:

    • 感谢您的回复,但我无法通过该方法使其正常工作,我将立即发布我的答案
    【解决方案2】:

    您不需要设置[application setApplicationSupportsShakeToEdit:YES];,因为这是默认值,iOS 仅将其用于摇动以撤消/重做。

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

    Event Handling Programming Guide 中所述。

    希望这会有所帮助。

    PS:以防万一,您在 viewDidAppear 方法中调用了错误的 super。这应该是:

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

    【讨论】:

    • 非常感谢您的及时回复并看到我的错字错误,我确实按照您的建议更改了它...但是没有骰子,仍然不起作用。
    • @Genhain 你收到回调 motionBegan 和 motionEnded 吗?即使您没有收到 UIEventSubtypeMotionShake 事件。
    • 不,它甚至没有到达回调函数,这就是我如此困惑的原因
    【解决方案3】:

    感谢大家的回复,但我最终使用了不同的方法,我在应用程序委托中访问了加速度计,然后通过 nsnotification 中心向当前显示的 ui 导航控制器发送 nsnotifcation

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

    【讨论】:

      猜你喜欢
      • 2012-04-26
      • 1970-01-01
      • 2021-11-12
      • 1970-01-01
      • 1970-01-01
      • 2013-03-22
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多