Дважды нажмите на UITableViewCell - PullRequest
8 голосов
/ 29 ноября 2011

Я хочу получить одно касание, а также двойное нажатие на UITableViewCell. Я создал customDataSource для UITableview.

Как мне этого добиться?

Ответы [ 5 ]

17 голосов
/ 29 ноября 2011

Правильный способ сделать это - добавить свой UITapGestureRecognizer в tableView:

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

UITapGestureRecognizer* singleTap = [[UITapGestureRecognizer alloc] initWithTarget:self action:@selector(singleTap:)];
singleTap.numberOfTapsRequired = 1;
singleTap.numberOfTouchesRequired = 1;
[singleTap requireGestureRecognizerToFail:doubleTap];
[self.tableView addGestureRecognizer:singleTap];

Затем в ваших методах обратного вызова вы найдете ячейку с чем-то вроде этого:

-(void)singleTap:(UITapGestureRecognizer*)tap
{
    if (UIGestureRecognizerStateEnded == tap.state)
    {
        CGPoint p = [tap locationInView:tap.view];
        NSIndexPath* indexPath = [_tableView indexPathForRowAtPoint:p];
        UITableViewCell* cell = [_tableView cellForRowAtIndexPath:indexPath];
        // Do your stuff
    }
}
7 голосов
/ 15 января 2013

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

[tapRecognizer setDelaysTouchesBegan:YES];
[tapRecognizer setCancelsTouchesInView:YES];
1 голос
/ 26 сентября 2013

вы забыли о [выпуске DoubleTap];

UITapGestureRecognizer *doubleTap = [[UITapGestureRecognizer alloc] initWithTarget:self action:@selector(doubleTap:)];

doubleTap.numberOfTapsRequired = 2;

doubleTap.numberOfTouchesRequired = 1;

[cell addGestureRecognizer:doubleTap];

[doubleTap release];
0 голосов
/ 30 мая 2018

Хорошо, так что на этот раз я добавил кнопку в ячейку, охватывающую полную ширину и высоту. и используя событие касания UIBUTTON, которое я использую.

[btnCellReview addTarget:self action:@selector(multipleTap:withEvent:) 
             forControlEvents:UIControlEventTouchDownRepeat];

-(IBAction)multipleTap:(id)sender withEvent:(UIEvent*)event {    
UITouch* touch = [[event allTouches] anyObject];
if (touch.tapCount == 2) {
      // do action.    
}
}
0 голосов
/ 09 июля 2015

Вы должны иметь эту строку для разделения между одинарным и двойным касаниями. [singleTap requireGestureRecognizerToFail: doubleTap]; Вот пример кода.

- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath
{
  // After cell initialized code
  //...
  //...

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

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

  [cell addGestureRecognizer:singleTap];
  [cell addGestureRecognizer:doubleTap];
  return cell;
}

-(void)doubleTap:(UITapGestureRecognizer*)tap
{
  NSLog(@"Double Taps");

  CGPoint point = [tap locationInView:self.tableView];
  NSIndexPath* indexPath = [self.tableView indexPathForRowAtPoint: point];
  UITableViewCell* cell = [self.tableView cellForRowAtIndexPath:indexPath];
  // do your stuff.
  // ...
}

-(void)singleTap:(UITapGestureRecognizer*)tap
{
  NSLog(@"Single Tap");
  CGPoint point = [tap locationInView:self.tableView];
  NSIndexPath* indexPath = [self.tableView indexPathForRowAtPoint:point];
  UITableViewCell* cell = [self.tableView cellForRowAtIndexPath:indexPath];

  // Do you stuff with index path or cell here.
  // ...

}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...