[iPhone Development] Double Tap 다루기

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

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

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

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

- (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: 를 사용하면 호출을 취소할 수 있습니다.

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

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

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

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

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

by 펠러 | 2009/06/27 00:50 | Development | 트랙백 | 덧글(0)

UIWebView 에서 페이지의 타이틀 얻기

우리가 알고 있는 일반적인 인터넷 브라우저들은 모두 현재 로드된 페이지의 타이틀을 윈도우의 제목으로 보여줍니다.

아이폰에서 UIWebView를 이용하여 브라우저를 구현하고자 할 때 이 타이틀을 얻어오는 방법입니다.

정말 간단한데, 무려 1년동안이나 모르고 있었네요. (1년동안 모르고 있던걸, 구글링으로 10초만에 찾다니... 허무합니다... 자바스크립트에 대해선 거의 문외한인 제 무식도 한 몫 했어요. ㅜ.ㅜ)

- (void)webViewDidFinishLoad:(UIWebView *)webView { 
NSString* title = [webView stringByEvaluatingJavaScriptFromString: @"document.title"]; 
navbar.title = title; 
}



by 펠러 | 2009/06/10 02:04 | Development | 트랙백 | 덧글(0)

뷰에 속성이 있는 스트링 그리기




- (void)drawRect:(NSRect)rect {
    NSString    *string = @"Got Fill?";
    NSMutableDictionary *stringAttributes = [NSMutableDictionary dictionary];

    // Set a font and specify a "fill" color
    [stringAttributes setObject: [NSFont fontWithName:@"Arial-Black" size:64] forKey: NSFontAttributeName];
    [stringAttributes setObject: [NSColor whiteColor] forKey: NSForegroundColorAttributeName];

    // Set a negative width so we get both stroke and fill to show
    [stringAttributes setObject: [NSNumber numberWithFloat: -2.0] forKey: NSStrokeWidthAttributeName];
    [stringAttributes setObject: [NSColor blackColor] forKey: NSStrokeColorAttributeName];

    // Now paint the background
    [[NSColor grayColor] set];
    [NSBezierPath fillRect: [self bounds]];

    // And finally draw the string with these attributes
    [string drawAtPoint: NSMakePoint(100, 100) withAttributes: stringAttributes];
}

by 펠러 | 2009/05/17 18:03 | Development | 트랙백 | 덧글(0)

◀ 이전 페이지          다음 페이지 ▶