iPhoneDev: вот что я делаю.
У меня есть пользовательский объект UIWindow. В этом объекте есть NSTimer, который сбрасывается при каждом касании. Чтобы получить это прикосновение, вы должны переопределить метод sendEvent в UIWindow.
вот как выглядит метод sendEvent в моем классе пользовательского окна:
- (void)sendEvent:(UIEvent *)event
{
if([super respondsToSelector: @selector(sendEvent:)])
{
[super sendEvent:event];
}
else
{
NSLog(@"%@", @"CUSTOM_Window super does NOT respond to selector sendEvent:!");
ASSERT(false);
}
// 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)
{
// anyObject works here.
UITouchPhase phase = ((UITouch *)[allTouches anyObject]).phase;
if (phase == UITouchPhaseBegan || phase == UITouchPhaseEnded)
{
[self resetIdleTimer];
}
}
}
вот это resetIdleTimer:
- (void)resetIdleTimer
{
if (self.idleTimer)
{
[self.idleTimer invalidate];
}
self.idleTimer = [NSTimer scheduledTimerWithTimeInterval:PASSWORD_TIMEOUT_INTERVAL target:self selector:@selector(idleTimerExceeded) userInfo:nil repeats:NO];
}
после этого в idleTimerExceeded я отправляю сообщение делегатам окна (в данном случае appDelegate).
- (void)idleTimerExceeded
{
[MY_CUSTOM_WINDOW_Delegate idleTimeLimitExceeded];
}
Когда я создаю этот объект пользовательского окна в appDelegate, я устанавливаю appDelegate в качестве делегата для этого окна. И в определении appDelegate idleTimeLimitExceeded, где я делаю то, что я должен, когда истекает таймер. Ключевым моментом является создание собственного окна и переопределение функции sendEvent. Объедините это с двумя указаниями клавиатуры, показанными выше, которые я добавил в методе init пользовательского класса окна, и вы сможете получать 99% всех сенсорных событий на экране в любом месте приложения.