Обнаруживать только двойное или одиночное касание с помощью UIViews?

Я хочу обнаруживать ТОЛЬКО двойное / одиночное касание, когда пользователь касается представления.

Я сделал что-то вроде этого:

- (void)touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event 
{
    UITouch *touch = [touches anyObject];
    CGPoint prevLoc = [touch ]
    if(touch.tapCount == 2)
        NSLog(@"tapCount 2");
    else if(touch.tapCount == 1)
        NSLog(@"tapCount 1");
}

Но он всегда обнаруживает 1 нажатие перед 2 нажатиями. Как я могу обнаружить только 1/2 нажатия?


person trung nguyen    schedule 28.02.2011    source источник
comment
Я думаю, это лучший способ. stackoverflow.com/ questions / 7175086 /   -  person KJLucid    schedule 30.09.2011


Ответы (3)


Спасибо за помощь. Я тоже нашел такой способ:

-(void)handleSingleTap
{
    NSLog(@"tapCount 1");
}

-(void)handleDoubleTap
{
    NSLog(@"tapCount 2");
}

- (void)touchesEnded:(NSSet *)touches withEvent:(UIEvent *)event
{
    NSUInteger numTaps = [[touches anyObject] tapCount];
    float delay = 0.2;
    if (numTaps < 2) 
    {
        [self performSelector:@selector(handleSingleTap) withObject:nil afterDelay:delay ];     
        [self.nextResponder touchesEnded:touches withEvent:event];
    } 
    else if(numTaps == 2) 
    {
        [NSObject cancelPreviousPerformRequestsWithTarget:self];            
        [self performSelector:@selector(handleDoubleTap) withObject:nil afterDelay:delay ];
    }               
}
person trung nguyen    schedule 28.02.2011

Поможет определить методы однократного и двойного касания.

(void) handleSingleTap {}
(void) handleDoubleTap {}

Итак, в touchesEnded вы можете вызвать соответствующий метод в зависимости от количества нажатий, но вызовите handleSingleTap только после задержки, чтобы убедиться, что двойное нажатие не было выполнено:

-(void) touchesEnded(NSSet *)touches withEvent:(UIEvent *)event {
  if ([touch tapCount] == 1) {
        [self performSelector:@selector(handleSingleTap) withObject:nil
           afterDelay:0.3]; //delay of 0.3 seconds
    } else if([touch tapCount] == 2) {
        [self handleDoubleTap];
    }
}

В touchesBegan отмените все запросы на handleSingleTap, чтобы второе касание отменило вызов первого касания к handleSingleTap, и будет вызываться только handleDoubleTap

[NSObject cancelPreviousPerformRequestsWithTarget:self
  selector:@selector(handleSingleTap) object:nil];
person dianovich    schedule 28.02.2011
comment
Чтобы добавить код в свой пост, выделите пространство табуляции для каждой строки или используйте параметр «Код» вверху и вставьте код в это пространство. - person RVN; 26.04.2011

Маби можно использовать некоторый временной интервал. Подождите с отправкой события в течение (x) мс. Если вы получили два нажатия за этот период времени, отправьте двойное нажатие. Если у вас есть только одна отправка, одно нажатие.

person Bakery    schedule 28.02.2011