试图检测抖动,从不调用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 的建议(创建一个返回 YES
的 canBecomeFirstResponder
方法,然后调用它),但它什么也没做。叫正常,但对抖动不识别没有影响。
我已经阅读了一些关于需要创建我的视图的自定义版本的内容,但我真的不想搞砸,因为我没有以编程方式创建视图,而且大约有四个。
提前致谢!
【问题讨论】:
请看:***.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