2011-09-29 6 views
0

나는 프로그램에서 터치 상태를 추적하는 touchStatus이라는 변수가 있습니다. 변수는 touchesBegan 메소드에서 B, touchesEnded에서는 E, touchesMoved에서는 M으로 설정됩니다.지연 터치 응답

그러나 내 요구 사항은 약간 다릅니다. 손가락에서 화면까지 들어 올리는 것과 touchStatus가 E으로 설정되는 사이에 1 초의 지연이 발생하도록 프로그램을 요청했습니다. 1 초가 경과하기 전에 사용자가 화면을 터치하면 touchStatus는 M 또는 B (1 초 전에 있었는지)이 계속됩니다.

어떻게하면됩니까?

답변

1

당신은 값이 같은 설정해야하는지 여부를 모니터링 할 수

[self performSelector:@selector(setEndedValue:) withObject:self afterDelay:1.0]; 

이 BOOL을 만들고 사용할 수 있습니다

BOOL hasTouchRestarted = NO; 

값이 설정되기 전에 화면을 다시 터치하면, 값을 YES로 변경하고 setEndedValue 메소드에서 리턴하십시오.

-(void)setEndedValue { 
    if (hasTouchRestarted) { return; } 
    // set value 
    self.touchStatus = E; 
} 
+0

아아! 정말 고마워. 너무 간단했습니다. 아래에 제안 된 일부 사람들처럼 타이머를 사용하려고했지만 코드가 너무 많습니다. 어쨌든'performSelector : withObject : afterDelay'는 매력처럼 작동합니다. 나는 이것에 대해 전에 생각 했어야했다! – Ravi

+0

물론! 타이머는 끔찍하게 벗겨지며 올바르게 무효화하지 않으면 동시에 두 개 이상의 실행을 가질 수 있습니다. PerformSelector는 모든 것을 처리합니다. – seejaneworkit

0

touchEnded 루틴에서 1 초 안에 선택기를 호출하는 NSTimer 태스크를 설정합니다. 그 전에 다른 접촉이 있으면 타이머 작업을 취소하십시오.

0

NSTimer * 타이머 ivar를 사용하여 지연된 통화를 시작하고 사용자가 1 초 전에 손가락을 들으면 통화를 취소합니다.

- (void)touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event { 
    self.myvar = @"B"; 
    [self.timer invalidate]; 
    self.timer = [NSTimer scheduledTimerWithTimeInterval:1.0 target:self selector:@selector(handleOneSecondPress) userInfo:nil repeats:NO]; 
} 
- (void)touchesEnded:(NSSet *)touches withEvent:(UIEvent*)event { 
    [self.timer invalidate]; 
    self.timer = nil; 
} 
- (void)touchesMoved:(NSSet *)touches withEvent:(UIEvent *)event { 
    self.myvar = @"M"; 
} 
- (void)handleOneSecondPress { 
    self.timer = nil; 
    self.myvar = @"E"; 
}