如何在iPhone中检测摇动

时间:2011-05-18 09:19:50

标签: objective-c xcode iphone-sdk-3.0 shake

在摇晃iPhone设备上我希望调用一些功能,我不知道如何识别抖动所以我尝试了一些链接并尝试了这段代码

- (void)motionBegan:(UIEventSubtype)motion withEvent:(UIEvent *)event
{
    if(event.type == UIEventSubtypeMotionShake)
    {
        NSLog(@"called");
        [self.view setBackgroundColor:[UIColor greenColor]];
    }
}

- (BOOL)canBecomeFirstResponder
{ 
return YES; 
}

但是唉没有运气所以你能告诉我如何做同样的事情

谢谢和问候

4 个答案:

答案 0 :(得分:32)

根据上面讨论的评论,我正在回答我的问题,以便其他人可以阅读我所拥有的解决方案

在UIResponder类文档中,据说运动事件只会响应第一响应者,所以我所做的只是添加一个小函数,这对我来说很有用,所以这是我的解决方案

- (void)motionBegan:(UIEventSubtype)motion withEvent:(UIEvent *)event
{
    if(event.type == UIEventSubtypeMotionShake)
    {
        NSLog(@"called");
        [self.view setBackgroundColor:[UIColor greenColor]];
    }
}

- (BOOL)canBecomeFirstResponder
{ 
return YES; 
}

现在我仍然无法检测到任何摇晃动作,所以我所要做的就是让我的视图控制器成为第一响应者,而这就是我使用的代码

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

我完成了

这是我提出的解决方案

谢谢和问候

答案 1 :(得分:2)

你可以这样做......

...首先

在App的委托中设置applicationSupportsShakeToEdit属性:

- (void)applicationDidFinishLaunching:(UIApplication *)application {

    application.applicationSupportsShakeToEdit = YES;

    [window addSubview:viewController.view];
    [window makeKeyAndVisible];
}

...其次

在视图控制器中添加/覆盖canBecomeFirstResponder,viewDidAppear:和viewWillDisappear:方法:

-(BOOL)canBecomeFirstResponder {
    return YES;
}

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

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

...第三

将motionEnded方法添加到View Controller:

- (void)motionEnded:(UIEventSubtype)motion withEvent:(UIEvent *)event
{
   if (motion == UIEventSubtypeMotionShake)
   {
    // your code
   }
 }

如果第一个答案没有,这应该有效,而且只是快速输入未经测试:)

答案 2 :(得分:0)

要全局处理应用程序的所有屏幕上的抖动,您可以继承UIWindow并实现motionEnded,因为事件将使响应程序链冒泡,直到它到达窗口对象。使用Xamarin的例子:

public class MyWindow : UIWindow
{
    public MyWindow(CoreGraphics.CGRect frame)
        : base (frame)
    { }

    public override void MotionEnded (UIEventSubtype motion, UIEvent evt)
    {
        if (motion == UIEventSubtype.MotionShake) {
            Console.WriteLine ("Shake received");
        }
    }
}

接下来,在AppDelegate中,实现window方法以返回UIWindow子类的实例。使用Xamarin的例子:

public class AppDelegate : UIApplicationDelegate
{
    UIWindow _window;

    public override UIWindow Window 
    { 
        get
        {
            if (_window == null) {
                _window = new MyWindow (UIScreen.MainScreen.Bounds);
            }

            return _window;
        }
        set
        {
        }
    }

    // ...
}

Voilà,震动在整个应用程序中处理。

答案 3 :(得分:0)

SSEventListener让事情变得更轻松。您的视图控制器不再需要覆盖motionEnded:withEvent:!使用SSEventListener,您可以像这样简单地听取震动事件:

[viewController ss_setShakeEventListener:^{ ... }];