2010-08-10 7 views
2

키보드의 터치 이벤트를 감지 할 수 있어야합니다. 일정 기간 동안 사용하지 않은 화면 (예 : 터치 이벤트 없음)을 표시하는 앱이 있습니다.이 문제를 해결하기 위해 UIWindow를 서브 클래 싱하고 sendEvent 함수를 구현하여 전체 애플리케이션에서 터치 이벤트를받을 수있었습니다. 이 방법을 한 곳에서 구현합니다. 이것은 키보드가 나타나고 사용자가 키보드로 타이핑 할 때 옆에서 작동합니다. 내가 알아야 할 것은 키보드에서 touch 이벤트를 감지하는 방법이 있다는 것입니다. 이는 sendEvent가 uiWindow에서하는 것과 같습니다. 미리 감사드립니다.iphone 키보드 터치 이벤트

+0

화면이 비활성 상태인지 확인하는 코드를 게시 할 수 있습니까? 나는 똑같이하고있다. 그냥 사용자가 활성화되어 있는지 확인 appdelegate에 타이머를 사용하여 r을 알고 싶었 ... – iPhoneDev

+0

내 대답을 참조하십시오. – Bittu

답변

4

이 문제의 해결책을 찾았습니다. 다음 알림을 볼 경우 키를 누를 때 이벤트를받을 수 있습니다. 이러한 사용자 정의 uiwindow 클래스에 이러한 알림을 추가 했으므로 응용 프로그램 전체에서 이러한 터치 이벤트를받을 수 있습니다.

[[NSNotificationCenter defaultCenter] addObserver: self selector: @selector(keyPressed:) name: UITextFieldTextDidChangeNotification object: nil]; 
[[NSNotificationCenter defaultCenter] addObserver: self selector: @selector(keyPressed:) name: UITextViewTextDidChangeNotification object: nil]; 

- (void)keyPressed:(NSNotification*)notification 
{ [self resetIdleTimer]; } 

어쨌든 다른 사람에게 도움이되기를 바랍니다.

0

iPhoneDev : 여기 내가하고있는 일이 여기있다.

사용자 지정 UIWindow 개체가 있습니다. 이 객체에는 터치가있을 때마다 재설정되는 NSTimer가 있습니다. 이 터치를 얻으려면 UIWindow의 sendEvent 메서드를 재정의해야합니다. 이 후

- (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에, 나는에 메시지를 보내

여기
- (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입니다 :

은 sendEvent 방법은 내 사용자 지정 창 클래스의 모습입니다 창 위임 (이 경우 appDelegate).

- (void)idleTimerExceeded 
{ 
    [MY_CUSTOM_WINDOW_Delegate idleTimeLimitExceeded]; 
} 

appDelegate에서이 사용자 정의 윈도우 객체를 만들 때 appDelegate를이 윈도우의 위임자로 설정합니다. 그리고 idleTimeLimitExceeded의 appDelegate 정의에서 타이머가 만료 될 때해야 할 일을합니다. 핵심은 사용자 정의 윈도우를 만들고 sendEvent 함수를 재정의하는 것입니다. 이것을 위의 두 키보드 알림과 결합하여 사용자 정의 윈도우 클래스의 init 메소드에 추가 했으므로 응용 프로그램의 어느 위치에서나 모든 터치 이벤트의 99 %를 화면에서 가져올 수 있어야합니다.