检查用户最后一次触摸屏幕

来源:互联网 发布:中电数据 医疗 编辑:程序博客网 时间:2024/05/01 11:08

方案一:让你的应用程序委托子类化 UIApplication。在实现部分,覆盖 sendEvent:方法:

- (void)sendEvent:(UIEvent *)event {

     [super sendEvent:event];

      // 只在开始或结束触摸时 reset 闲置时间, 以减少不必须要的时钟 reset 动作

     NSSet *allTouches = [event allTouches];

     if ([allTouches count] > 0) {

         // allTouchescount 似乎只会是 1, 因此 anyObject 总是可用的

        UITouchPhase phase =((UITouch *)[allTouches anyObject]).phase;

         if (phase ==UITouchPhaseBegan || phase == UITouchPhaseEnded)

            [self resetIdleTimer];

     }

}

- (void)resetIdleTimer {

     if (idleTimer) {

         [idleTimerinvalidate];

         [idleTimerrelease];

     }

     idleTimer = [[NSTimer scheduledTimerWithTimeInterval:maxIdleTimetarget:self selector:@selector(idleTimerExceeded) userInfo:nil repeats:NO]retain];

}

- (void)idleTimerExceeded {

     NSLog(@"idle time exceeded");

}

这里, maxIdleTime 和 idleTimer 都是实例变量.

此外你要修改 main.m,告诉 UIApplicationMain 使用你的 delegate 类(在这个例子里,即 AppDelegate)作为主类:

int main(int argc, char *argv[])

{

    @autoreleasepool{

       return UIApplicationMain(argc, argv, NSStringFromClass([AppDelegateclass]), NSStringFromClass([AppDelegate class]));

    }

}

方案二:本方案不需要子类化UIApplication。它能在某个 UIViewController 子类上生效,因此对于只有一个 ViewController(比如一个互动式应用或游戏)相当有用,或者只想在一个 View Controller 中处理用户闲置时间。

它不会在重置时钟时重建 NSTimer 对象,而仅仅是修改它的触发时间。

在你的代码中,你可以调用 resetIdleTimer 去检测各种事件(比如加速计的急剧改变)。

@interface MainViewController : UIViewController {

     NSTimer*idleTimer;

}

@end 

#define kMaxIdleTimeSeconds 60.0

@implementation MainViewController

#pragma mark -

#pragma mark Handling idle timeout

- (void)resetIdleTimer {

     if(!idleTimer) {

         idleTimer =[[NSTimer scheduledTimerWithTimeInterval:kMaxIdleTimeSeconds                                                      target:self                                                    selector:@selector(idleTimerExceeded)                                                    userInfo:nil                                                     repeats:NO] retain];

     }

     else {

         if(fabs([idleTimer.fireDate timeIntervalSinceNow]) < kMaxIdleTimeSeconds-1.0){

            [idleTimer setFireDate:[NSDate dateWithTimeIntervalSinceNow:kMaxIdleTimeSeconds]];

         }

     }

 } 

- (void)idleTimerExceeded {

     [idleTimerrelease];

 idleTimer = nil;

     [selfstartScreenSaverOrSomethingInteresting];

     [selfresetIdleTimer];

- (UIResponder *)nextResponder {

     [selfresetIdleTimer];

     return[super nextResponder];

- (void)viewDidLoad {

     [superviewDidLoad];

     [selfresetIdleTimer];

@end

为简便起见,忽略了内存管理代码。