检测自上次触摸屏幕以来的用户不活动

检测自上次触摸屏幕以来的用户不活动

本文介绍了iPhone:检测自上次触摸屏幕以来的用户不活动/空闲时间的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

有没有人实现过一个功能,如果用户在一段时间内没有触摸屏幕,你就会采取某种行动?我正在想办法做到这一点.

Has anybody implemented a feature where if the user has not touched the screen for a certain time period, you take a certain action? I'm trying to figure out the best way to do that.

UIApplication 中有这个有点相关的方法:

There's this somewhat-related method in UIApplication:

[UIApplication sharedApplication].idleTimerDisabled;

如果你有这样的东西就好了:

It'd be nice if you instead had something like this:

NSTimeInterval timeElapsed = [UIApplication sharedApplication].idleTimeElapsed;

然后我可以设置一个计时器并定期检查该值,并在超过阈值时采取一些措施.

Then I could set up a timer and periodically check this value, and take some action when it exceeds a threshold.

希望这能解释我在寻找什么.有没有人已经解决了这个问题,或者对你将如何做有任何想法?谢谢.

Hopefully that explains what I'm looking for. Has anyone tackled this issue already, or have any thoughts on how you would do it? Thanks.

推荐答案

这是我一直在寻找的答案:

Here's the answer I had been looking for:

让您的应用程序委托子类 UIApplication.在实现文件中,像这样覆盖 sendEvent: 方法:

Have your application delegate subclass UIApplication. In the implementation file, override the sendEvent: method like so:

- (void)sendEvent:(UIEvent *)event {
    [super sendEvent:event];

    // Only want to reset the timer on a Began touch or an Ended touch, to reduce the number of timer resets.
    NSSet *allTouches = [event allTouches];
    if ([allTouches count] > 0) {
        // allTouches count only ever seems to be 1, so anyObject works here.
        UITouchPhase phase = ((UITouch *)[allTouches anyObject]).phase;
        if (phase == UITouchPhaseBegan || phase == UITouchPhaseEnded)
            [self resetIdleTimer];
    }
}

- (void)resetIdleTimer {
    if (idleTimer) {
        [idleTimer invalidate];
        [idleTimer release];
    }

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

- (void)idleTimerExceeded {
    NSLog(@"idle time exceeded");
}

其中 maxIdleTime 和 idleTimer 是实例变量.

where maxIdleTime and idleTimer are instance variables.

为了让它工作,你还需要修改你的 main.m 来告诉 UIApplicationMain 使用你的委托类(在这个例子中是 AppDelegate)作为主体类:

In order for this to work, you also need to modify your main.m to tell UIApplicationMain to use your delegate class (in this example, AppDelegate) as the principal class:

int retVal = UIApplicationMain(argc, argv, @"AppDelegate", @"AppDelegate");

这篇关于iPhone:检测自上次触摸屏幕以来的用户不活动/空闲时间的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持!

08-21 10:37