遇到这样的要求:无论在哪个应用程序view controller,摇动手机,我们可以启动的方法。

你可以认为这个想法是使用包装的苹果“MotionEvent”。但是,假如简单地把代码添加到view controller于,所以只存在view controller示在前端时,摇动手机才会出发方法。

- (BOOL)canBecomeFirstResponder {//默认是NO,所以得重写此方法,设成YES
return YES;
}

然后实现下列方法://非常像TouchEvent事件

- (void)motionBegan:(UIEventSubtype)motion withEvent:(UIEvent *)event
{
}

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

- (void)motionCancelled:(UIEventSubtype)motion withEvent:(UIEvent *)event
{
}


解决方法:用Category扩展UIWindow。代码例如以下:

UIWindow+.h

#import <UIKit/UIKit.h>


#define UIEventSubtypeMotionShakeNotification @"UIEventSubtypeMotionShakeNotification"


@interface UIWindow (Motion)

// @override
- (BOOL)canBecomeFirstResponder;
- (void)motionEnded:(UIEventSubtype)motion withEvent:(UIEvent *)event;

@end


UIWindow+.m

#import "UIWindow+.h"


@implementation UIWindow (Motion)
- (BOOL)canBecomeFirstResponder {//默认是NO,所以得重写此方法。设成YES
return YES;
}

然后实现下列方法://非常像TouchEvent事件

- (void)motionBegan:(UIEventSubtype)motion withEvent:(UIEvent *)event
{
}

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

- (void)motionCancelled:(UIEventSubtype)motion withEvent:(UIEvent *)event
{
}

@end