如何配置我的应用程序以检测抖动运动事件?
Posted
技术标签:
【中文标题】如何配置我的应用程序以检测抖动运动事件?【英文标题】: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);
我完全被难住了。
【问题讨论】:
【参考方案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];
【讨论】:
以上是关于如何配置我的应用程序以检测抖动运动事件?的主要内容,如果未能解决你的问题,请参考以下文章
使用 react-native-sensors 检测抖动设备事件?
如何使用 CMDeviceMotion 检测我的设备运行速度?