14

在 iPhone 设备的抖动上,我想调用一些函数,我不知道如何识别抖动,所以我尝试了一些链接并尝试了这段代码

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

- (BOOL)可以成为第一响应者
{
返回是;
}

但可惜没有运气,所以你能告诉我我怎么能做同样的事吗

谢谢并恭祝安康

4

4 回答 4

33

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

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

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

- (BOOL)可以成为第一响应者
{
返回是;
}

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

- (void)viewDidAppear:(BOOL)animated {
    [超级 viewDidAppear:动画];
    [自己成为FirstResponder];
}

我完成了

这是我想出的解决方案

谢谢并恭祝安康

于 2011-05-19T09:20:25.593 回答
2

你可以做这样的事情......

首先...

在 App 的 Delegate 中设置 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 方法添加到您的视图控制器:

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

如果第一个答案没有,那应该可以工作,而且这只是快速输入而不是测试:)

于 2013-04-01T22:59:05.613 回答
0

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

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

于 2018-01-15T06:49:52.420 回答
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
        {
        }
    }

    // ...
}

瞧,整个应用程序都会处理抖动。

于 2015-08-30T16:32:45.460 回答