遇到这样一个需求:应用无论处于哪个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