2011-05-18 85 views
11

在iPhone設備,我想叫一些功能,我不知道如何識別搖的震動,所以我嘗試了一些鏈接,並試圖將此代碼如何檢測抖動運動在iPhone

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

- (BOOL)canBecomeFirstResponder 
{ 
return YES; 
} 

但是,唉沒有運氣能請你讓我知道我可以做同樣的

感謝和問候

+0

如果你嘗試過的代碼? – Vladimir 2011-05-18 09:23:07

+0

在uiview控制器子類文件 – Radix 2011-05-18 09:28:27

+0

@Radix,我在UIWindow的子類中使用它,並使用NSNotification通知其他控制器在搖動事件。使用UICOntroller子類的代碼,我沒有工作,以及如果我沒有記錯 – Vladimir 2011-05-18 09:31:10

回答

30

按照上述意見討論我正在回答我的問題,以便其他人可以讀,我已經得到了解決

在UIResponder類文檔據說是運動事件將在第一響應者只響應所以我所做的就是添加只是一個小功能,並且做的把戲對我來說,所以這裏是我的解決方案

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

- (BOOL)canBecomeFirstResponder 
{ 
return YES; 
} 

現在,我仍然無法檢測到任何抖動的運動,因此所有我要做的就是讓我的ViewController第一響應併爲這裏的,我用

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

的代碼,我做

這是我想出了

感謝和問候

+0

爲我工作。乾杯。 – 2012-05-25 10:33:23

+0

謝謝!像魅力一樣工作! – atomikpanda 2013-02-06 20:22:03

+0

好極了,謝謝:) – mondousage 2013-11-19 18:14:49

1

你可以做這樣的事情......

首先解決...

設置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 
    } 
} 

這應該工作,如果第一個答案沒有,這只是很快鍵入沒有測試:)

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中,實現窗口的方法來回報您的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à,搖動在整個應用程序中處理。

0

SSEventListener變得更容易了。您的視圖控制器不需要重寫motionEnded:withEvent:!隨着SSEventListener,您可以偵聽抖動事件如此簡單:

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