【问题标题】:How to detect shake motion in iPhone如何在 iPhone 中检测抖动运动
【发布时间】:2011-05-18 09:19:50
【问题描述】:

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

- (void)motionBegan:(UIEventSubtype)motion withEvent:(UIEvent *)event { if(event.type == UIEventSubtypeMotionShake) { NSLog(@"调用"); [self.view setBackgroundColor:[UIColor greenColor]]; } } - (BOOL)可以成为第一响应者 { 返回是; }

可惜没有运气所以请你告诉我如何做同样的事情

感谢和问候

【问题讨论】:

  • 你在哪里试过那个代码?
  • 在uiview控制器子类文件中
  • @Radix,我在 UIWindow 子类中使用了它,并使用 NSNotification 通知其他控制器发生抖动事件。如果我没记错的话,在 UIController 子类中使用该代码对我也不起作用
  • @Vladimir :嘿,猜猜我得到的代码是什么我需要做的就是添加这段代码 - (void)viewDidAppear:(BOOL)animated { [super viewDidAppear:animated]; [自己成为FirstResponder];它是因为 UIResponder 摇动事件响应第一响应者,就我在文档中读到的并且让这件事正常工作....
  • @Radix,嗯,好点。发布该解决方案作为您问题的答案并接受它 - 这样其他人就可以更轻松地找到您的解决方案

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


【解决方案1】:

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

在 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]; }

我已经完成了

这是我想出的解决方案

感谢和问候

【讨论】:

  • 谢谢!像魅力一样工作!
  • 它在晃动 iPhone 时的工作及其检测。但是有什么方法可以继续检测抖动吗?
【解决方案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
   }
 }

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

【讨论】:

    【解决方案3】:

    要在应用程序的所有屏幕上全局处理抖动,您可以继承 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
            {
            }
        }
    
        // ...
    }
    

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

    【讨论】:

      【解决方案4】:

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

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

      【讨论】:

        猜你喜欢
        • 2012-04-26
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2021-11-12
        • 1970-01-01
        • 1970-01-01
        • 2016-04-18
        • 2021-09-02
        相关资源
        最近更新 更多