试图检测抖动,从不调用motionEnded

Posted

技术标签:

【中文标题】试图检测抖动,从不调用motionEnded【英文标题】:Trying to detect a shake, motionEnded is never called 【发布时间】:2012-12-04 12:40:44 【问题描述】:

我正在尝试检测 ios6 中的抖动,似乎每个示例都是在 2009 年左右为 iOS3 编写的,并且没有任何工作正常。这是我的方法:

- (void) motionEnded: (UIEventSubtype) motion withEvent: (UIEvent *) event 
    if (motion == UIEventSubtypeMotionShake) NSLog(@"Detected a shake");

我已经尝试过 Apple 的建议(创建一个返回 YEScanBecomeFirstResponder 方法,然后调用它),但它什么也没做。叫正常,但对抖动不识别没有影响。

我已经阅读了一些关于需要创建我的视图的自定义版本的内容,但我真的不想搞砸,因为我没有以编程方式创建视图,而且大约有四个。

提前致谢!

【问题讨论】:

请看:***.com/questions/6042420/… 【参考方案1】:

在您的 viewController 中,您必须重写方法 caneBecomeFirstResponder 并回答“是”,在 viewDidAppear 中您必须将您的 viewController (self) 设置为第一响应者。这是代码:

-(void)motionEnded:(UIEventSubtype)motion withEvent:(UIEvent *)event 
    if (motion == UIEventSubtypeMotionShake) NSLog(@"Detected a shake");


-(BOOL)canBecomeFirstResponder 
    return YES;



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

    [self becomeFirstResponder];

【讨论】:

我在我的设备上尝试了上面的代码:iPhone 4S、iPhone 5、iPad 3 和带有 IOS 5 的 iPad 1。上面的代码在所有设备上都可以正常工作。 那么这里有其他问题,因为从不调用motionEnded方法。只是想追查到底是什么。 原来我需要 viewDidAppear,而不是 viewDidLoad。不知道为什么。【参考方案2】:

原来我需要 viewDidAppear,而不是 viewDidLoad。不知道为什么。

【讨论】:

你不应该再发一个帖子来回答这个问题。应该接受 Giuseppe 的帖子作为正确答案! 我觉得区分 viewDidLoad(我在原始问题中没有提到)和 viewDidAppear 需要单独的答案。 Giuseppe 提供了一个解决方案,但我想澄清实际问题(使用 Load over Appear)。 viewDidLoad 仅与加载到内存中的视图有关。它与正在设置的视图无关,即:处于可以成为第一响应者的状态。

以上是关于试图检测抖动,从不调用motionEnded的主要内容,如果未能解决你的问题,请参考以下文章

iPhone 抖动问题:加载 viewController 时未调用 viewDidAppear

iphone检测整个应用程序的抖动

Opencv算法在移动/抖动相机中检测移动车辆

MPU 6050 陀螺仪/加速度计和抖动检测

Android Shake(Sensor) 服务,用于在应用程序后台进行抖动检测

检测 html5 移动设备中的抖动