因此,让我首先澄清一下我已经实施了哪些代码
-(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);
我非常难过。
答案 0 :(得分:3)
为了检测摇动手势,你需要子类化UIView并实现以下方法(不要在UIViewController上实现这些方法):
然后将子类视图添加到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];
}