如何检测和解决iPhone震动问题

6

我正在尝试在这个页面上实现摇晃“教程”,但我觉得我漏掉了一些东西。我将他的加速计函数复制到我的AppViewController.m文件中,并在其中添加了一些nslogs,以查看当我使用模拟器的“摇晃”功能时,它是否进入该函数。调试控制台中没有任何显示。

http://mithin.in/2009/07/28/detecting-a-shake-using-iphone-sdk

有人能解释一下我可能错过的东西吗?或者给我指一条教程的路?

我找到了这个,看起来很有前途,但我不知道如何“将它放在UIView中” 如何检测iPhone被摇晃的时候


编辑 - 现在根据已接受的答案建议,这是我的工作代码。

以下是我用于检测3.0 iphone sdk中摇晃手势的代码。

-(BOOL)canBecomeFirstResponder {
    return YES;
}

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

- (void)viewWillDisappear:(BOOL)animated {
    [self resignFirstResponder];
    [super viewWillDisappear:animated];
}


- (void)motionEnded:(UIEventSubtype)motion withEvent:(UIEvent *)event {
    NSLog(@"{motion ended event ");

    if (motion == UIEventSubtypeMotionShake) {
        NSLog(@"{shaken state ");

    }
    else {
        NSLog(@"{not shaken state ");       
    }
}

是的,在模拟器中可以运行。 - Neo42
事实上,调用becomeFirstResponder是不必要的。唯一需要执行的操作是确保viewController可以成为firstResponder,以便响应运动事件。正如文档所述,UIView通过响应者链传递motionBegan等消息,最终会找到视图的控制器,只要canBecomeFirstResponder返回YES即可。 - Joshua J. McKinnon
2个回答

6
这是我的可行答案:
//MainViewController.m
-(void)motionBegan:(UIEventSubtype)motion withEvent:(UIEvent *)event {

    [[NSNotificationCenter defaultCenter] addObserver:self
                                             selector:@selector(shake) 
                                 name:@"shake" object:nil];

    if(event.type == UIEventTypeMotion && event.subtype == UIEventSubtypeMotionShake)
        NSLog(@"motion Began");
}

-(void)motionEnded:(UIEventSubtype)motion withEvent:(UIEvent *)event {
    [[NSNotificationCenter defaultCenter] addObserver:self
                                             selector:@selector(shake)
                                                 name:@"shake"
                                               object:nil];
    if(event.type == UIEventTypeMotion && event.subtype == UIEventSubtypeMotionShake)
        NSLog(@"motion Ended");
}

-(void)motionCancelled:(UIEventSubtype)motion withEvent:(UIEvent *)event {
    [[NSNotificationCenter defaultCenter] addObserver:self
                                             selector:@selector(shake) 
                                                 name:@"shake" 
                                               object:nil];
    if(event.type == UIEventTypeMotion && event.subtype == UIEventSubtypeMotionShake)
        NSLog(@"motion Cancelled");
}

-(void)viewDidLoad {
    [super viewDidLoad];

    [self becomeFirstResponder];
}

- (void)viewDidUnload {
    // Release any retained subviews of the main view.
    // e.g. self.myOutlet = nil;
    [self resignFirstResponder]; 

}

我只在模拟器上进行了测试,结果如下:
2010-06-22 12:40:48.799 Cocktails[14589:207] motion Began

2010-06-22 12:40:48.800 Cocktails[14589:207] motion Ended

我希望这能帮到你,因为我已经花费了2个小时在这项工作上。

4
您绝对不应该直接使用自己的过滤器来处理摇晃事件并侦听 UIAccelerometer。这是一项高功耗操作,只应由需要高加速度计采样率的应用程序使用。改用已添加到 UIEvent 中的新运动事件:
与触摸一样,运动事件将传递到第一个响应者,然后如果第一个响应者没有响应,则沿着响应者链向上移动。 UIEvent 将具有类型 UIEventTypeMotion 和子类型 UIEventSubtypeMotionShake。 http://developer.apple.com/IPhone/library/documentation/iPhone/Conceptual/iPhoneOSProgrammingGuide/EventHandling/EventHandling.html#//apple_ref/doc/uid/TP40007072-CH9-SW24

谢谢您的3.0响应!我会尝试这个。 - Neo42
6年过去了,链接已经失效,但是答案仍然很好。这是新链接:https://developer.apple.com/library/prerelease/ios/documentation/EventHandling/Conceptual/EventHandlingiPhoneOS/motion_event_basics/motion_event_basics.html - Martin

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接