2010-04-14 2 views
4

Я пытаюсь обнаружить двойные краны в представлении, но когда приходит двойной кран, первый щелчок запускает действие на TouchesBegan, поэтому, прежде чем обнаруживать двойной кран, первый.iphone - double tap fail safe way

Как я могу сделать это так, чтобы просто обнаружить двойной кран?

Я не могу использовать жесты OS 3.x, потому что я должен сделать его совместимым со старыми версиями ОС.

спасибо

ответ

14

Некоторые выдержки из примера tapZoom в scrollViewSuite образце кода:

Во-первых, функция пнуть вещи после того, как прикосновение закончилось:

- (void)touchesEnded:(NSSet *)touches withEvent:(UIEvent *)event { 

    UITouch *touch = [touches anyObject]; 

    if ([touch tapCount] == 1) { 

      [self performSelector: @selector(handleSingleTap) 
         withObject: nil 
         afterDelay: 0.35]; // after 0.35s we call it a single tap 

    } else if([touch tapCount] == 2) { 

      [self handleDoubleTap]; 
    } 

} 

Второе: перехватывать сообщение, если в течение таймаута возникло новое касание:

- (void)touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event { 

    [NSObject cancelPreviousPerformRequestsWithTarget: self 
              selector: @selector(handleSingleTap) 
               object: nil]; 
} 

см. также: http://developer.apple.com/iphone/library/documentation/WindowsViews/Conceptual/UIScrollView_pg/ZoomingByTouch/ZoomingByTouch.html#//apple_ref/doc/uid/TP40008179-CH4-SW1

и здесь: (Scrollview люкс) http://developer.apple.com/iphone/library/samplecode/ScrollViewSuite/Introduction/Intro.html

+0

спасибо. Извините за задержку. – SpaceDog

2

Вы смотрите на tapCount? Например:

- (void)touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event { 
     UITouch *touch = [[event allTouches] anyObject]; 
     if (touch.tapCount == 2) { 
        //double-tap action here 
     } 
} 
6

Изменить: Я пропустил момент, что вы сказали, вы не можете использовать 3.x жесты, так что это неверный ответ на ваш вопрос, но я ухожу это может быть полезно для тех, кто может использовать жест 3.x.

Вы можете создать два жест распознавателей, один для одного крана и один для двойного нажатия:

UITapGestureRecognizer *singleTapGesture = [[UITapGestureRecognizer alloc] initWithTarget:self action:@selector(handleTouchesOne:)]; 
singleTapGesture.cancelsTouchesInView = NO; 
singleTapGesture.delaysTouchesEnded = NO; 
singleTapGesture.numberOfTouchesRequired = 1; // One finger single tap 
singleTapGesture.numberOfTapsRequired = 1; 
[self.view addGestureRecognizer:singleTapGesture]; 
[singleTapGesture release]; 

UITapGestureRecognizer *doubleTapGesture = [[UITapGestureRecognizer alloc] initWithTarget:self action:@selector(handleTouchesTwo:)]; 
doubleTapGesture.cancelsTouchesInView = NO; 
doubleTapGesture.delaysTouchesEnded = NO; 
doubleTapGesture.numberOfTouchesRequired = 1; // One finger double tap 
doubleTapGesture.numberOfTapsRequired = 2; 
[self.view addGestureRecognizer:doubleTapGesture]; 
[doubleTapGesture release]; 

И потом, здесь идет удар:

[singleTapGesture requireGestureRecognizerToFail : doubleTapGesture]; 

В последней строке, делает ваш единственный Обработчик крана работает только в случае сбоя двойного крана. Таким образом, вы получаете как однократное нажатие, так и двойное нажатие в вашем приложении.

+0

На самом деле удар ... при использовании обоих Жестов. [SingleTapGesture requireGestureRecognizerToFail: doubleTapGesture]; Сохранено много времени. –