2009-08-15 3 views
13

Какое временное ограничение для двух кранов можно считать двойным касанием на iPhone OS?Двойной кран или два однократных крана?

// Редактировать: Почему это важно?

Для того, чтобы обращаться с одним краном и двойным касанием по-разному, руководство Apple говорит, чтобы сделать performSelector...afterDelay с некоторым «разумным» интервалом при первом касании (и отменить его позже, если обнаружен второй ответвитель).

Проблема заключается в том, что если интервал слишком короткий (0,1), однократное нажатие будет выполняться даже при двойном нажатии (если используется только на tapCount, то есть). Если он слишком длинный (0,8), пользователь будет ожидать ненужного для распознавания одного крана, если нет возможности двойного касания.

Это должно быть точно правильный номер, чтобы работать оптимально, но определенно не меньше, или есть вероятность появления ошибок (одновременный однократный и двойной щелчок).

+0

Вы можете указать, какую платформу вы спрашиваете. – retracile

+0

retracile, проверьте теги. – JoshJordan

+0

@retracile: на этом вопросе есть тег «iphone» (ну, может быть, он не был там 35 секунд назад, когда вы отправили свой комментарий); так что, я предполагаю, что это на iphone-платформе ;-) –

ответ

11

Вы можете обнаружить любое количество нажатий на жесте крана. Не нужно играть с NSTouches. Для всех пользователей, ищущих решение здесь, он есть.

Эти простые строки кода выполняют функции единого и двойного крана.

UITapGestureRecognizer *doubleTapRecg = [[UITapGestureRecognizer alloc] 
              initWithTarget:self 
              action:@selector(doubleTapped:)]; 
    doubleTapRecg.delegate = self; 
    doubleTapRecg.numberOfTapsRequired = 2; 
    doubleTapRecg.numberOfTouchesRequired = 1; 
    [view addGestureRecognizer:doubleTapRecg]; 


    UITapGestureRecognizer *tapRecg = [[UITapGestureRecognizer alloc] 
             initWithTarget:self 
             action:@selector(tapped:)]; 
    tapRecg.delegate = self; 
    tapRecg.numberOfTapsRequired = 1; 
    tapRecg.numberOfTouchesRequired = 1; 
    [view addGestureRecognizer:tapRecg]; 
    [tapRecg requireGestureRecognizerToFail:doubleTapRecg]; 


    [doubleTapRecg release]; 
    [tapRecg release]; 
+2

Я меняю принятый ответ на этот вопрос, так как сейчас это правильный способ сделать это. Но прежде чем комментировать предыдущий ответ и называть другие ответы мусором, имейте в виду, что они были опубликованы за 3 года до вашего и до того, как UITapGestureRecognizer даже существовал;) –

+0

это была моя другая учетная запись: D – yunas

+0

Без ручных таймеров или задержек, которые заставляют вас решить, сколько msecs ждать, потрясающе! – cprcrack

1

Я не верю, что существует ограничение по умолчанию - это то, что «чувствует» право, когда вы его пробуете. У Apple есть пример here, где они также не указывают определенное время.

+0

Должен быть предел, так как tapCount UITouch не увеличивается, если клики разделены на две части, но это происходит, если они близки друг к другу. –

5

На форуме разработчиков на developer.apple.com, разработчик Apple, сказал:

  • Там нет постоянной временной интервал, но общесистемное определение подразумевается сегодня в свойстве tapCount в UITouch.
  • Для этой задержки и задержки прикосновений и удержания нет значения по умолчанию.
  • SpringBoard имеет значение hardcoded.

Я представил это Apple как bug 68405.

10
- (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; 
    } 

} 
@end 

для меня этот код работает отлично втирают .... :) последнее сообщение было около 15 августа 09 .... , но я собирался через ту же проблему, так думали разделить решение я нашел ....

0

Я не уверен, если это правильный способ делать вещи, но этот код работает хорошо для меня.

в моем файле .h:

@interface MyViewController : UIViewController { 

int tapCount; 

} 
@property (nonatomic, assign)int tapCount; 
@end 

в моей .m файл:

@synthesize tapCount; 

- (void)tapGesture:(UIGestureRecognizer*)gesture { 
    tapCount = tapCount + 1; 
    [self performSelector:@selector(correctTapCount) withObject:nil afterDelay:0.3]; 


} 
-(void)correctTapCount { 
    if (tapCount == 1) { 
     NSLog(@"Single Tap"); 
    } 
    if (tapCount == 2) { 
     NSLog(@"Double Tap"); 
    } 

    //reset TapCount 
    tapCount = 0; 
} 

И это где я добавить мой водопроводную слушателя (это на UIImageView)

//add tap listener 
carImage.userInteractionEnabled = YES; 
UITapGestureRecognizer *tap = [[UITapGestureRecognizer alloc] initWithTarget:self action:@selector(tapGesture:)]; 
[carImage addGestureRecognizer:tap]; 
[tap release]; 

Удачи и счастливого кодирования!

Смежные вопросы