iPhone: 检查用户最后一次触摸屏幕的时间
2013-08-02 14:08
274 查看
原文:http://stackoverflow.com/questions/273450/iphone-detecting-user-inactivity-idle-time-since-last-screen-touch
方案一:让你的应用程序委托子类化 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
为简便起见,忽略了内存管理代码。
方案一:让你的应用程序委托子类化 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
为简便起见,忽略了内存管理代码。
相关文章推荐
- 检查用户最后一次触摸屏幕
- 显示用户触摸持续的时间
- cookie:记住用户最后一次的访问时间,并清空指定cookie
- linux 操作系统中检查特定用户上次登录的时间lastlog命令的使用
- iPhone开发进阶(8)— 检测屏幕触摸事件
- ios监听用户是否触摸了屏幕的一种实现
- Linux lastlog(查看所有用户最后一次登录时间)命令
- 如何实现用户触摸屏幕就隐藏弹出的键盘功能
- (10) iphone 开发 用户点击,触摸和手势识别 解析
- linux服务器如何检查远程用户登陆状态、时间、ip地址等信息
- 事件处理---显示用户持续触摸时间
- 活动目录中如何查看用户最后一次登录时间
- 检测触摸事件(用户触摸屏幕时提示信息)
- 用户时间数据的检查
- iPhone判断2次触摸间隔时间
- 检查数据库最后一次备份的时间
- 用Windows命令行如何检查Windows系统补丁(KBxxxxxx)的最后一次安装时间?
- 利用Cookies跟踪用户最后一次访问的日期和时间
- linux服务器如何检查远程用户登陆状态、时间、ip地址等信息
- iphone开发 用户点击,触摸和手势识别 解析