[iPhone Development] Double Tap 다루기 Development

아이폰 개발을 시작하고 처음으로 '더블 탭' 을 다루려고 하면, 한참을 헤매게 됩니다.

화면에 한 번에 터치한 갯수는 쉽게 알아올 수 있지만, 문제는 '더블 탭'을 했다는 메시지와 동시에, '싱글 탭' 메시지가 두 번 연속 같이 발생한다는 점입니다.

'싱글 탭'에 대한 구현이 없다면 전혀 상관이 아닌 일이지만, '싱글 탭'과 '더블 탭'을 둘 다 구현해야 된다면 상당히 고민을 하게 됩니다.

해답은 다음 코드를 보시면 알 수 있습니다. ( 네 번 연속 터치까지 잡아내는 코드입니다. )

- (void)touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event {
 UITouch *touch = [touches anyObject];
 NSUInteger tapCount = [touch tapCount];
 
 switch (tapCount) {
  case 1:
   [self performSelector:@selector(singleTapMethod) withObject:nil afterDelay:.4];
   break;
  case 2:
   [NSObject cancelPreviousPerformRequestsWithTarget:self selector:@selector(singleTapMethod) object:nil];
   [self performSelector:@selector(doubleTapMethod) withObject:nil afterDelay:.4];
   break;
  case 3:
   [NSObject cancelPreviousPerformRequestsWithTarget:self selector:@selector(doubleTapMethod) object:nil];
   [self performSelector:@selector(tripleTapMethod) withObject:nil afterDelay:.4];
   break;
  case 4:
   [NSObject cancelPreviousPerformRequestsWithTarget:self selector:@selector(tripleTapMethod) object:nil];
   [self quadrupleTap];
   break;
  default:
   break;
 }
}

곧바로 메소드를 호출하지 않고, performSelector:withObject:afterDelay: 를 사용하면 메소드 호출시 딜레이를 줄 수 있습니다.
딜레이 된 메소드가 호출되기 전에 cancelPreviousPerformRequestsWithTarget:selector:object: 를 사용하면 호출을 취소할 수 있습니다.

아이폰 기본 내장 프로그램들 중에도 한 화면에 '싱글탭'과 '더블탭'을 두 개 다 받아들이는 경우에는 '싱글탭' 했을 때 액션이 딜레이 되는 것을 볼 수 있는데, 아마 그들도 위에처럼 구현되었기에 그런 것 같습니다.

그런데, 위 구현의 문제는, 
게임과 같이 유저 액션에 즉각적으로 반응해야만 하는 경우에는 거의 무용지물이 되어버린다는 겁니다.

저도 간단한 게임을 만들며 '싱글탭'과 '더블탭'을 동시에 사용할 일이 있어서, 위와 같은 구현을 적용해 봤는데, 딜레이 때문에 도저히 사용할 수가 없었습니다.

딜레이의 제약이 없다면 위의 구현은 좋은 선택입니다.

누구 더 좋은 방법 아시는 분 안 계신가요?


트랙백

이 글과 관련된 글 쓰기 (트랙백 보내기)
TrackbackURL : http://felaur.egloos.com/tb/2381977 [도움말]

덧글

덧글 입력 영역