2013-10-01 3 views
12

Например, у меня есть представление, где я хочу две различных жестов:Как обнаружить кран и двойной кран в то же время с помощью UITapGestureRecognizer?

крана, чтобы сделать действие A. двойного нажатия, чтобы сделать Действие B.

проблемы с UITapGestureRecognizer я могу только установить минимально необходимое количество водопроводного , Единственный распознаватель жестов распознает сигнал перед тем, как распознаватель двойного касания распознает двойной кран.

Пример:

_tapGestureRecognizer = [[UITapGestureRecognizer alloc] initWithTarget:self action:@selector(tapGestureRecognized:)]; 
_tapGestureRecognizer.numberOfTouchesRequired = 1; 
_tapGestureRecognizer.numberOfTapsRequired = 1; 
[self addGestureRecognizer:_tapGestureRecognizer]; 

_doubleTapGestureRecognizer = [[UITapGestureRecognizer alloc] initWithTarget:self action:@selector(doubleTapGestureRecognized:)]; 
_doubleTapGestureRecognizer.numberOfTouchesRequired = 1; 
_doubleTapGestureRecognizer.numberOfTapsRequired = 2; 
[self addGestureRecognizer:_doubleTapGestureRecognizer]; 

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

+0

Возможное решение и дублирование: http://stackoverflow.com/questions/7175086/iphone-single-tap-gesture-conflicts-with-double-one – xarly

+0

Попробуйте это, чтобы удалить задержку или настроить ее, к которой вы хотите. http://stackoverflow.com/a/25368653/3060790 – Pagly

ответ

42

Вот что я использовал в одном из моих старых проектов, надеюсь, это поможет вам выйти из-под человека.

UITapGestureRecognizer *singleTap = [[[UITapGestureRecognizer alloc] initWithTarget: self action:@selector(doSingleTap)] autorelease]; 
singleTap.numberOfTapsRequired = 1; 
[self.view addGestureRecognizer:singleTap]; 

UITapGestureRecognizer *doubleTap = [[[UITapGestureRecognizer alloc] initWithTarget: self action:@selector(doDoubleTap)] autorelease]; 
doubleTap.numberOfTapsRequired = 2; 
[self.view addGestureRecognizer:doubleTap]; 

    [singleTap requireGestureRecognizerToFail:doubleTap]; 
+0

Отлично! Большое спасибо! – openfrog

+9

Это работает, но, для одного нажатия на него делает задержку при вызове одного крана – Mrug

+1

^^ Кто-нибудь выяснил решение этой задержки? – barfoon

-1

Я нашел решение для задержки одного крана, используя ответ XCode Monkey. Используя этот подход, вы можете настроить в миллисекундах порог между одним и двойным нажатием. Этот метод использует простой UIButton и NSTimer для дифференциации между одиночным и двойным нажатием.

@property NSTimer  *tapTimer; 
@property BOOL   isDoubleTap; 

    UIButton *yourButton = [UIButton new]; 
    yourButton.frame = // set your frame 
    [yourButton addTarget:self action:@selector(handleTap:) forControlEvents:UIControlEventTouchUpInside]; 
    [self.view yourButton]; 


-(void)handleTap:(UIButton*)button 
{ 
    [self.tapTimer invalidate]; 

    if (self.isDoubleTap) 
    { 
    [self doDoubleTap]; 
    return; 
    } 
    self.isDoubleTap = YES; 
    // CHANGE THE 0.3 SECOND THRESHOLD BETWEEN SINGLE/DOUBLE TAP TO YOUR HEART'S CONTENT 
    self.tapTimer = [NSTimer scheduledTimerWithTimeInterval:0.3 target:self selector:@selector(doSingleTap) userInfo:nil repeats:NO]; 
} 

-(void)doSingleTap 
{ 
    self.isDoubleTap = NO; 
} 

-(void)doDoubleTap 
{ 
    self.isDoubleTap = NO; 
} 
+0

Отсутствие улучшения задержки И создает потенциальные проблемы с пользователями, которые нажимают на несколько ячеек менее чем за 0,3 секунды. – ChuckKelly

+0

Вы либо должны сохранять значительную задержку (0,2), либо обнаружение двойного крана не регистрируется до истечения таймера одиночного крана. – Jeet

5

На быстрых 3 и стремительных 4:

let singleTap = UITapGestureRecognizer(target: self, action: #selector(doSingleTap)) 
singleTap.numberOfTapsRequired = 1 

self.view.addGestureRecognizer(singleTap) 

let doubleTap = UITapGestureRecognizer(target: self, action: #selector(doDoubleTap)) 
doubleTap.numberOfTapsRequired = 2 

self.view.addGestureRecognizer(doubleTap) 

singleTap.require(toFail: doubleTap) 
+0

Я использую singleTap.requireGestureRecognizerToFail (doubleTap) вместо singleTap.require (toFail: doubleTap) – Marcos

+0

Ответ на Swift 3 @Marcos – Logan

0
{ UITapGestureRecognizer *doubleTap = [[UITapGestureRecognizer alloc]initWithTarget:self action:@selector(handleDoubleTapGesture:)]; 
     [doubleTap setDelegate:self]; 
     doubleTap.numberOfTapsRequired = 2; 
     [self.headerView addGestureRecognizer:doubleTap]; 

     UITapGestureRecognizer *singleTap = [[UITapGestureRecognizer alloc]initWithTarget:self action:@selector(handleSingleTapGesture:)]; 
     singleTap.numberOfTapsRequired = 1; 
     [singleTap setDelegate:self]; 
     [doubleTap setDelaysTouchesBegan:YES]; 
     [singleTap setDelaysTouchesBegan:YES]; 
     [self.headerView addGestureRecognizer:singleTap]; 
    } 
     - (BOOL)gestureRecognizer:(UIGestureRecognizer *)gestureRecognizer shouldReceiveTouch:(UITouch *)touch{ 
      return YES; 
     } 

    - (BOOL)gestureRecognizer:(UIGestureRecognizer *)gestureRecognizer shouldRecognizeSimultaneouslyWithGestureRecognizer:(UIGestureRecognizer *)otherGestureRecognizer{ 
     return YES; 
    } 

Создать жест распознаватели внутри любого метода вы хотите. Например, если вы хотите, нажмите жесты для вашего headerView в Tableview создать эти жесты крана внутри

- (UIView *)tableView:(UITableView *)tableView viewForHeaderInSection:(NSInteger)section 

И ваш класс должен реализовать UIGestureRecognizerDelegate. Вышеупомянутые два метода этого класса делегата.

+0

Некоторые объяснения значительно улучшат качество вашего ответа. – mrun

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