Дважды нажмите или два однократных нажатия?

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

//Edit: Почему это важно?

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

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

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

Ответы

Ответ 1

Вы можете обнаружить любое количество нажатий на жесте крана. Нет необходимости играть с 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

- (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

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

Ответ 4

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

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

Я отправил это в Apple как ошибка 68405.

Ответ 5

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

Ответ 6

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

в моем .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];

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