UIApplication のsendEvent:メソッドをフックする
タッチイベントを取得したタイミングでタイマーをセットする
一定時間タッチイベントがなかったらTimerのメソッドが発火する.
(新しいタッチイベントでタイマーをリセットする)
1, AppDelegateをUIApplicationのサブクラスにする
2, AppDelegateでsendEventをオーバーライドする
3, main.mでUIApplicationMainの第3匹数にAppDelegateのクラス名を設定する
------- main.m ------------------
1 2 3 4 5 6 | int main( int argc, char * argv[]) { @autoreleasepool { return UIApplicationMain(argc, argv, @ "WEMAppDelegate" , NSStringFromClass([WEMAppDelegate class ])); } } |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 | @interface WEMAppDelegate () @property (nonatomic, weak) NSTimer *idleTimer; @end @implementation WEMAppDelegate - ( BOOL )application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions { // Override point for customization after application launch. return YES; } : いろいろなしょり : - ( void )sendEvent:(UIEvent *)event { [super sendEvent:event]; NSSet *allTouches = [event allTouches]; if ([allTouches count] > 0) { UITouchPhase phase = ((UITouch *)[allTouches anyObject]).phase; if (phase == UITouchPhaseBegan || phase == UITouchPhaseEnded) { [self resetIdleTimer]; } } } - ( void )resetIdleTimer { if ( self.idleTimer != nil ) { [self.idleTimer invalidate]; self.idleTimer = nil; } self.idleTimer = [NSTimer scheduledTimerWithTimeInterval:10 target:self selector:@selector(idleTimerExceeded) userInfo:nil repeats:NO]; } - ( void )idleTimerExceeded { /* 一定時間経過したよの処理 */ } @end |
0 件のコメント :
コメントを投稿